Toon posts:

[VB.NET 2005] Pointer naar waarde

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,
Ik ben nu al anderhalve dag bezig met het terughalen van gegevens uit het geheugen.
Het gaat om een postcode opzoeken via straat + plaats + huisnummer.
Dit gaat via een .dll bestand, dus daar heb ik geen code van.
Het enige wat ik krijg is een pointer naar een plek in het geheugen en ik heb een functie:
CopyMemoryRead die het via die pointer uit het geheugen moet lezen.
In vb6, het project waar dit uitkomt werkt het prima maar in vb.net 2005 helaas niet.
Ik heb op internet vele mensen gezien met bijna hetzelfde probleem alleen iedereen schrijft
zelf iets naar het geheugen, maar ik heb alleen een pointer waar ik het mee moet doen.
Hieronder staat de code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
    Public Shared tmpData As Integer

    Public Declare Auto Sub CopyMemoryRead Lib "kernel32" Alias _
        "RtlMoveMemory" (ByVal Destination As Int32, ByVal Source As Int32, ByVal Length As Int32)

        Dim zipcodeNumber As Int32
        Call CopyMemoryRead(tmpData, zipcodePointer, 2)
        zipcodeNumber = tmpData
        Debug.Print("zipcodeNumber = " & zipcodeNumber)

Dit is de foutmelding die ik krijg: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Ik heb dat copymemory voorbeeld van codeproject al doorgespit.
Het schijnt dat je dit ook met Marshal.Copy kunt doen, maar ook daarmee kom ik er niet uit.
Ik krijg daarbij geen foutmelding maar gekke tekens terug i.p.v. de gewenste postcode
Weet iemand een oplossing of goede site voor dit probleem ?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik vermoed dat je de eerste parameter als ByRef moet definieren, maar zeker weten doe ik dat niet.

Verwijderd

Topicstarter
bigbeng schreef op dinsdag 06 maart 2007 @ 12:51:
Ik vermoed dat je de eerste parameter als ByRef moet definieren, maar zeker weten doe ik dat niet.
Thanks, dat werkt, ik had dat al geprobeerd maar dan met alle 3 en niet alleen de eerste.
Ik was al die tijd zo dichtbij al, bedankt _/-\o_

Verwijderd

Topicstarter
Er is ook nog een mogelijkheid om via postcode en huisnummer te zoeken, die werkt nu wel maar dat is een beetje slordig geprogrammeerd, niet via de manier zoals het zou moeten omdat ik daar niet uit kwam. Ik heb nu ook met ByRef geprobeerd maar dat werkte niet. Ik zal de code even kopieeren:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
    Public Declare Function GetStringLengthFromPointer Lib "kernel32" _
        Alias "lstrlenA" (ByVal lpString As String) As Int32

    Public Declare Function StringCopy Lib "kernel32" Alias "lstrcpyA" _
        (ByVal lpString1 As String, ByVal lpString2 As Int32) As Int32

        Dim aantal As Integer
        aantal = GetStringLengthFromPointer(streetPointer)
        Call StringCopy(aantal , streetPointer)

Dit is de code vanuit vb6
Visual Basic:
1
2
    street$ = String(GetStringLengthFromPointer(ByVal streetPointer), 0)
    Call StringCopy(ByVal street, ByVal streetPointer)

Weet iemand toevallig waarom de vb.net code niet werkt ?
Ik krijg hierbij geen error maar niet de juiste gegevens terug

Verwijderd

Topicstarter
ik heb bijvoorbeeld deze functie op een site gevonden:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
      Public Function PointerToStringA(ByVal lpStringA As Integer) As String
            Dim nLen As Integer
            Dim sTemp As String
            
            If lpStringA Then
                  nLen = lstrlenA(CStr(lpStringA))
                  If nLen Then
                        sTemp = New String(vbNullChar, nLen)
                        lstrcpy(sTemp, lpStringA)
                        PointerToStringA = sTemp
                  End If
            End If
      End Function

daar heb ik dan het volgende van gemaakt:
Visual Basic .NET:
1
2
3
4
5
        Dim strTemp As String
        Dim straat As Integer
        straat = GetStringLengthFromPointer(CStr(straatPointer))
        strTemp = New String(vbNullChar, straat)
        Call StringCopy(strTemp, straatPointer)

dan is straat (lengte) 3 en is strTemp de eerste 3 karakters van de straat i.p.v. de hele straat.

Verwijderd

Topicstarter
In de functie GetStringLengthFromPointer heb ik de parameter van string naar int32 gezet
en nu krijg ik een hoger getal terug, het aantal karakters van de string getelt vanaf 0.
Als ik dan die integer + 1 doet krijg ik de hele straatnaam terug. Maar voorheen kreeg ik elke keer 8 terug, weet niet waar het verschil dan zit met wat ik nu heb. Met plaats gaat het ook goed, dus dat is de oplossing dan :*)
Pagina: 1