Auslesen eines Strings aus einer C-Struktur in VB

Veröffentlicht: 09. Dez 2001 | Aktualisiert: 13. Jun 2004

Von Hening Schünke

Bei der Verwendung von Windows-API Funktionen in Visual Basic steht man immer wieder vor dem Problem, einen String aus einer solchen Struktur auslesen zu müßen, von der im VB-Programm nicht mehr als die Adresse und der prinzipielle Aufbau bekannt ist.

Da Visual Basic den Umgang mit Pointern nicht direkt beherrscht, ist hier eine Hilfskonstruktion mit der Funktion CopyMemory erforderlich, die wie folgt in Ihrerm VB-Programm deklariert wird:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ 
(Destination As Any, Source As Any, ByVal Length As Long)

Destination bezeichnet die Zieladresse zu der Daten kopiert werden. Source ist die Quelladresse von der die Daten gelesen werden. Length ist die Anzahl der Bytes die kopiert werden sollen.

In der Funktion GetStringFromStruct wird das Auslesen eines Strings am Beispiel der Struktur COPYDATASTRUCT gezeigt, die folgendermaßen deklariert ist:

Public Type COPYDATASTRUCT 
        dwData As Long 
        cbData As Long 
        lpData As Long 
End Type

Diese Struktur dient zur Interprozess-Kommunikation mittels SendMessage. Die Variable dwData wird verwendet, um bis zu vier Byte beliebiger Daten aufzunehmen. Sie wird in diesem Beispiel nicht verwendet und hat den Wert 0 (Null). Die Variable cbData gibt die Anzahl der Bytes im Puffer an, auf den der Pointer in lpData verweist

Die Funktion GetStringFromStruct erhält als einzigen Parameter die Adresse der von einer beliebigen API-Funktion gefüllten Struktur übergeben und gibt den gelesenen String zurück. Als lokale Variablen sind der auszulesende String (strReturn) und die zu bearbeitende Struktur (udtCStruct) deklariert.

Mit CopyMemory wird jetzt zuerst der Inhalt der Struktur auf welche die übergebene Adresse verweist, in die lokal deklarierte Struktur kopiert. Dabei wird die lokale Struktur als Referenz übergeben (Defaulteinstellung in VB) und die Adresse der zun kopierenden Struktur als Wert. Auf den Inhalt der Struktur kann jetzt über die lokale Kopie zugegriffen werden und es ist bereits möglich, die Länge des Strings aus dem Variablen cbData auszulesen. Dies wird genutzt, um den Puffer entsprechend mit Leerzeichen zu initialisieren.

Der nächste Aufruf von CopyMemory dient jetzt dazu den lokalen Puffer des Strings mit Daten zu füllen. Dazu wird der lokale String als Wert (ByVal) übergeben. In diesem Fall übergibt VB nicht die Adresse des String-Deskriptors, sondern, der C-Konvention entsprechend, die Adresse des ersten Zeichens. Die Variable lpData wird ebenfalls als Wert übergeben, weil sie ja bereits eine Adresse enthält.

An Stelle der Struktur COPYDATASTRUCT kann auch jede andere Struktur, welche Pointer auf Strings enthält, verwendet werden.

Private Function GetStringFromStruct(ByVal lngpStruct As Long) As 
String 
    Dim strReturn As String 
    Dim udtCStruct As COPYDATASTRUCT 
    CopyMemory udtCStruct, ByVal lngpStruct, Len(udtCStruct) 
    strReturn = Space(udtCStruct.cbData) 
    CopyMemory ByVal strReturn, ByVal udtCStruct.lpData, 
udtCStruct.cbData 
    GetStringFromStruct = strReturn 
End Function