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