- Offizieller Beitrag
Ich spiele gerade mit der Möglichkeit Daten mittels Dll-Aufruf von AutoIt an Nim zu leiten.
In pur AutoIt würde ich das so machen, um Strings zu übertragen:
AutoIt
; ===== V E R S E N D E R =====
; == ByteArray erstellen, mit Daten füllen
Local $byteArray = _ByteArray_Create("wchar[128]", 3)
DllStructSetData ($byteArray[1], 1, "Daten #1")
DllStructSetData ($byteArray[2], 1, "Daten #2")
DllStructSetData ($byteArray[3], 1, "Daten #3")
; == Pointer für DllCall
Local $ptrData = DllStructGetPtr($byteArray[0])
; == fiktiver Aufruf
; DllCall('MyCommunicate.dll', 'int', 'sendData', 'ptr', $ptrData)
; ===== E M P F Ä N G E R =====
; == ByteArray aus Pointer erstellen
Local $aReceived = _ByteArray_Create("wchar[128]", 3, $ptrData)
ConsoleWrite(DllStructGetData($aReceived[1], 1) & @CRLF)
ConsoleWrite(DllStructGetData($aReceived[2], 1) & @CRLF)
ConsoleWrite(DllStructGetData($aReceived[3], 1) & @CRLF)
Func _ByteArray_Create($_sStruct, $_iElements=2, $_ptrArray0=Null)
Local $iSize = DllStructGetSize(DllStructCreate($_sStruct, 1))
Local $aByte[$_iElements +1]
If $_ptrArray0 <> Null Then
$aByte[0] = DllStructCreate('byte[' & $iSize *$_iElements & "]", $_ptrArray0)
Else
$aByte[0] = DllStructCreate('byte[' & $iSize *$_iElements & "]")
EndIf
Local $ptr = DllStructGetPtr($aByte[0])
For $i = 0 To $_iElements -1
$aByte[$i+1] = DllStructCreate($_sStruct, $ptr + $i*$iSize)
Next
Return $aByte
EndFunc ;==>_ByteArray_Create
Alles anzeigen
Nun ist die Frage, wie kann ich in Nim die Daten aus dem Pointer in eine Variable entpacken? Ich erstelle dazu den passenden Datentyp ByteArray, der so dimensioniert ist, dass er exakt die Daten aus dem Pointer aufnehmen kann - aber wie gehts?