; Array (1D) als Strukturelement ; Die Struktur sieht dann folgendermaßen aus: ; "Pointer-Array[Anzahl_Arrayelemente];je_Arrayelement_ein_Strukturelement...." ;================================================================================================== ; Bsp.: Array Zeichenkette ;================================================================================================== Local $countElements = 2 Local $maxStringLen = 255 Local $structChar = "ptr[" & $countElements & "];" & _ "char[" & $maxStringLen & "];" & _ "char[" & $maxStringLen & "]" Local $arrChar = DllStructCreate($structChar) ; Struktur mit Daten füllen ; erstes Strukturelement verweist auf Array mit Pointern je Element ; nachfolgende Strukturelemente enthalten die Daten des Arrays ; für jedes Arrayelement den Pointer setzen DllStructSetData($arrChar, 1, DllStructGetPtr($arrChar, 2), 1) DllStructSetData($arrChar, 1, DllStructGetPtr($arrChar, 3), 2) ; die Array-Werte eintragen DllStructSetData ($arrChar, 2, "Element_1") DllStructSetData ($arrChar, 3, "Element_2") ; Nehmen wir an, die Dll-Definition sieht so aus: #cs DLL Meine.DLL Funktion IrgendWas Returntyp long Parameter ElementName ParamTyp StringArray Daraus ergibt sich folgender Aufruf DllCall("Meine.DLL", "long", "IrgendWas", "ptr", DllStructGetPtr($arrChar, 1)) #ce ; Werte Auslesen über die Pointer ; der an den DllCall übergebene Pointer für das Pointerarray Local $ptrInDll = DllStructGetPtr($arrChar, 1) ; Arraystruktur zum Lesen nachstellen Local $structPtr = DllStructCreate("ptr[2]", $ptrInDll) ; Pointer des Wertearrays auslesen Local $ptrElement1 = DllStructGetData($structPtr, 1, 1) Local $ptrElement2 = DllStructGetData($structPtr, 1, 2) ; Struktur zum Lesen der Werte erstellen und aus Pointern befüllen Local $structRead $structRead = DllStructCreate("char[" & $maxStringLen & "]", $ptrElement1) ConsoleWrite(DllStructGetData($structRead, 1) & @CRLF) $structRead = DllStructCreate("char[" & $maxStringLen & "]", $ptrElement2) ConsoleWrite(DllStructGetData($structRead, 1) & @CRLF) ;================================================================================================== ; Bsp.: Array Integer ;================================================================================================== ; Integer Array Local $countElements = 10 ; für eine größere Anzahl von Arrayelementen Struktur in einer Schleife erstellen Local $structInt = "ptr[" & $countElements & "];" For $i = 1 To $countElements $structInt &= "int;" Next Local $arrInt = DllStructCreate($structInt) ; Struktur mit Daten füllen ; bei größerer Anzahl wieder in einer Schleife For $i = 1 To $countElements ; Pointer setzen DllStructSetData($arrInt, 1, DllStructGetPtr($arrInt, $i+1), $i) ; Wert setzen DllStructSetData($arrInt, $i+1, Random(1,1000,1)) Next ; Werte Auslesen über die Pointer ; für das IntegerArray wieder in eine Schleife Local $ptrInDll = DllStructGetPtr($arrInt, 1) Local $structPtr = DllStructCreate("ptr[" & $countElements & "]", $ptrInDll) Local $currPtr, $structRead For $i = 1 To $countElements ; Pointer für das Arrayelement $i auslesen $currPtr = DllStructGetData($structPtr, 1, $i) ; Werte-Struktur erstellen, auf Pointer verweisen $structRead = DllStructCreate("int", $currPtr) ; Wert ausgeben ConsoleWrite(DllStructGetData($structRead, 1) & @CRLF) Next