Funktionsreferenz


DllStructCreate

Erzeugt eine Struktur im C/C++-Stil die mit DllCall genutzt werden kann.

DllStructCreate ( Struct [,Pointer] )

Parameter

Struct Ein String, der die zu erzeugende Struktur repräsentiert (Siehe Bemerkung).
Pointer [optional] Falls bereitgestellt, belegt die Struktur keinen neuen Speicher, sondern nutzt den Speicher, auf dessen Adresse der übergebene Zeiger verweist.

Rückgabewert

Erfolg: Eine Variable für den Gebrauch in DllStruct-Aufrufen.
Fehler: 0.
@Error: 0 = Kein Fehler.
1 = Übergebene Variable an DllStructCreate war kein String.
2 = Unbekannter Datentyp in der übergebenen Variable.
3 = Belegung des benötigten Speichers für die Struktur fehlgeschlagen, oder Pointer = 0.
4 = Fehler bei der Belegung des Speichers für den übergebenen String.
Typ Details
BYTE 8bit(1byte) unsigned char
BOOLEAN 8bit(1byte) unsigned char
CHAR 8bit(1byte) ASCII char
WCHAR 16bit(2byte) UNICODE wide char
short 16bit(2bytes) signed integer
USHORT 16bit(2bytes) unsigned integer
WORD 16bit(2bytes) unsigned integer
int 32bit(4bytes) signed integer
long 32bit(4bytes) signed integer
BOOL 32bit(4bytes) signed integer
UINT 32bit(4bytes) unsigned integer
ULONG 32bit(4bytes) unsigned integer
DWORD 32bit(4bytes) unsigned integer
INT64 64bit(8bytes) signed integer
UINT64 64bit(8bytes) unsigned integer
ptr 32 or 64bit unsigned integer (Je nach dem, ob die x86 oder die x64 Version von AutoIt benutzt wird)
HWND 32bit(4bytes) integer
HANDLE 32bit(4bytes) integer
float 32bit(4bytes) floating point
double 64bit(8bytes) floating point
INT_PTR, LONG_PTR, LRESULT, LPARAM 32 or 64bit signed integer (Je nach dem, ob die x86 oder die x64 Version von AutoIt benutzt wird)
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM 32 or 64bit unsigned integer (Je nach dem, ob die x86 oder die x64 Version von AutoIt benutzt wird)

Bemerkungen

Jeder Datentyp muss mit einem Semikolon getrennt werden ';'. Array's werden durch hinzufügen von '[size]' nach dem Datentyp erzeugt: DllStructCreate("int;char[128]").

Ein Elementname kann ähnlich der C Deklaration hinzugefügt werden (DllStructCreate("int n;char buffer[128]")). Dieser Elementname kann anstelle eines Elements in anderen DllStruct... Funktionen genutzt werden. Er muss alphanumerisch und/oder mit einem Unterstrich sein (a-z,1-9,_).

Für eine andere Ausrichtung der Struktur kann man "align" als Prefix benutzen. Standardwert für n ist 8.
Erlaubte Werte sind 1, 2, 4, 8 und 16. Die Ausrichtung eines Elements wird entweder an der Grenze eines Vielfachen von n oder an der eines Vielfachen der Größe eines Elements sein, je nach dem welches kleiner ist. Dies ist wie bei der "#pragma pack option" mit dem Microsoft Visual C++ Compiler.

DllStructCreate("short;int") ; Die Struktur is 8 Bytes groß, der "int" beginnt ab Offset 4
DllStructCreate("align 2;short;int") ; Die Struktur is 6 Bytes groß, der "int" beginnt ab Offset 2

DllStructCreate("byte;double") ; Die Struktur is 16 Bytes groß, der "double" beginnt ab Offset 8
DllStructCreate("align 4;byte;double") ; Die Struktur is 12 Bytes groß, der "double" beginnt ab Offset 4

Wenn eine Änderung der Ausrichtung benötigt wird, kann "align" vor dem ersten Element, welches geändert werden werden soll, stehen. "align" oder "align 8" führt zur Standardausrichtung.

Um belegten Speicher wieder freizugeben, braucht man lediglich die zurückgegebene Variable auf 0 setzen.

Verwandte Funktionen

DllCall, DllStructGetData, DllStructSetData, DllStructGetPtr, DllStructGetSize, IsDllStruct

Beispiel


;=========================================================
;   Erzeugen der Struktur
;   struct {
;       int             var1;
;       unsigned char   var2;
;       unsigned int    var3;
;       char            var4[128];
;   }
;=========================================================
Local $str = "int var1;ubyte var2;uint var3;char var4[128]"
Local $a = DllStructCreate($str)
If @error Then
    MsgBox(0, "", "Fehler in DllStructCreate " & @error);
    Exit
EndIf

;=========================================================
;   Daten in Struktur setzen
;   struct.var1 = -1;
;   struct.var2 = 255;
;   struct.var3 = INT_MAX; -1 wird per typecast zu (unsigned int)
;   strcpy(struct.var4,"Hallo");
;   struct.var4[0]  = 'h';
;=========================================================
DllStructSetData($a, "var1", -1)
DllStructSetData($a, "var2", 255)
DllStructSetData($a, "var3", -1)
DllStructSetData($a, "var4", "Hallo")
DllStructSetData($a, "var4", Asc("h"), 1)

;=========================================================
;   Struktur-Info anzeigen
;=========================================================
MsgBox(0, "DllStruct", "Strukturgröße: " & DllStructGetSize($a) & @CRLF & _
        "Strukturzeiger: " & DllStructGetPtr($a) & @CRLF & _
        "Daten:" & @CRLF & _
        DllStructGetData($a, 1) & @CRLF & _
        DllStructGetData($a, 2) & @CRLF & _
        DllStructGetData($a, 3) & @CRLF & _
        DllStructGetData($a, 4))

;=========================================================
;   Den Speicher freigeben den die Struktur belegt hat
;=========================================================
$a = 0