DLL aufrufen und Zeigerrückgabe

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Pascal.

    DLL aufrufen und Zeigerrückgabe

    Hallo,

    ich habe folgendes Problem. Ich möchte mit Visual Basic (6.0 oder .NET) auf Funktionen in einer DLL zugreifen. Normale Funktionen, die einfach nur einen Rückgabewert geben funktionieren einwandfrei. Nur leider gibt es hier auch Funktionen, die einen Zeiger auf eine Adresse zurückgeben und hier ist das Problem! Wie frage ich mit Visual Basic den Wert in einer Adresse aus und wie rufe ich eine solche Funktion auf? Ich habe in verschiedenen Büchern nachgeschaut, jedoch steht dazu explizit nichts beschrieben oder kein Beispiel. Kann mir jemand dabei weiterhelfen.
    Die folgenden Funktionen haben folgende Strukur:

    SOURCE_API char* Funktion_X(unsigned int X);
    SOURCE_API bool Funktion_Y(unsigned __int8 *VWX, unsigned int XYZ);

    ... und so habe ich die Funktion bisher in Visual Basic deklariert:
    Declare Function myDll Lib "C:\MyDLL.dll" Alias "Funktion_X" (ByVal x As Integer) As Byte

    Es ist für mich sehr wichtig auf diese DLL zuzugreifen. Deshalb wäre ich sehr froh, wenn mir hier jemand weiterhelfen könnte, da ich bis jetzt schon fast einen ganzen Tag damit verbracht habe und noch nicht wirklich weitergekommen bin.

    Vielen Dank für jede Hilfe

    Grüße

    Lulu
    Pointer sind nicht so schwierig wie manche denken.

    Quellcode

    1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
    2. Dim lngPtrToAdress As Long
    3. Dim bytAddressValue As Byte
    4. 'Zeiger holen
    5. lngPtrToAddress = myDLL(x)
    6. 'Prüfen ob wir ihn erhalten haben; wenn ja ist er > 0
    7. If lngPtrToAddress = 0 Then
    8. Msgbox "Error while retrieving Pointer",vbInformation, "An error occured"
    9. ElseIf lngPtrToAddress > 0 Then
    10. 'Kopieren des Speicherbereichs zur Weiterverwendung in 'bytAddressValue'
    11. CopyMemory bytAddressValue, lngPtrToAddress, LenB(lngPtrToAddress)
    12. End If
    13. 'Fertig ;)


    Edit : Vielleicht sollte ich es auch mal erklären :

    Pointer sind Zeiger auf Adressen im Speicher, die unverändert bleiben sollen. Deswegen holt man sich nur die 'Wegbeschreibung' (Pointer) und kann dann mittels 'CopyMemory' den Wert herauskopieren, um ihn weiterzuverarbeiten (wie ein Abbild also).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pascal“ ()