Erzeugt eine Struktur im C/C++-Stil die mit DllCall genutzt werden kann.
DllStructCreate ( Struct [, Pointer] )
| 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. |
| Erfolg: | Eine Variable für den Gebrauch in DllStruct-Aufrufen. |
| Fehler: | Setzt das @error Flag auf ungleich 0. |
| @Error: | 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) Integer vorzeichenlos |
| BOOLEAN | 8Bit (1Byte) Integer vorzeichenlos |
| CHAR | 8bit(1byte) ASCII Zeichen |
| WCHAR | 16Bit (2Byte) UNICODE-Zeichen, (wide char) |
| SHORT | 16Bit (2Byte) Integer mit Vorzeichen |
| USHORT | 16Bit (2Byte) Integer vorzeichenlos |
| WORD | 16Bit (2Byte) Integer vorzeichenlos |
| INT | 32Bit (4Byte) Integer mit Vorzeichen |
| LONG | 32Bit (4Byte) Integer mit Vorzeichen |
| BOOL | 32Bit (4Byte) Integer mit Vorzeichen |
| UINT | 32Bit (4Byte) Integer vorzeichenlos |
| ULONG | 32Bit (4Byte) Integer vorzeichenlos |
| DWORD | 32Bit (4Byte) Integer vorzeichenlos |
| INT64 | 64Bit (8Byte) Integer mit Vorzeichen |
| UINT64 | 64Bit (8Byte) Integer vorzeichenlos |
| PTR | 32 oder 64bit Zeiger (Je nachdem, ob die x86 oder die x64 Version von AutoIt benutzt wird) |
| HWND | 32 oder 64bit Zeiger (Je nachdem, ob die x86 oder die x64 Version von AutoIt benutzt wird) |
| HANDLE | 32 oder 64bit Zeiger (Je nachdem, ob die x86 oder die x64 Version von AutoIt benutzt wird) |
| FLOAT | 32Bit (4Byte) Fließkommazahl |
| DOUBLE | 64Bit (8Byte) Fließkommazahl |
| INT_PTR, LONG_PTR, LRESULT, LPARAM | 32 oder 64Bit Integer mit Vorzeichen (in Abhängigkeit zur benutzten AutoIt Version x86 oder x64) |
| UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM | 32 oder 64Bit Integer vorzeichenlos (in Abhängigkeit zur benutzten AutoIt Version x86 oder x64) |
| STRUCT | Die nachfolgenden Datentypen werden ausgerichtet nach den Regeln der C-Deklaration. Siehe unten. |
| ENDSTRUCT | Ende einer Sammlung von Datentypen. Einbettung ist möglich, siehe unten. |
| ALIGN | n-Bytes Begrenzung an der Datentypen ausgerichtet werden. |
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,_).
Wird eine Zusammenstellung von Datentypen definiert wie in "struct{}" in C Deklaration, muss "STRUCT; ...; ENDSTRUCT;" angewendet werden.
Dies ist notwendig, um die Ausrichtung innerhalb der gesamten Struktur zu berücksichtigen. Dies ist nicht erforderlich, wenn alle Datentypen in der definierten Struktur, als eine implizite Struktur Ausrichtung angelegt wurden.
DllStructCreate("int;STRUCT;ptr;int;ENDSTRUCT;int") ; Struktur ist 32 byte unter einem Windows 64-Bit und 16 unter einem Windows 32-Bit
DllStructCreate("int;ptr;int;int") ; Struktur ist 24 byte unter einem Windows 64-Bit und 16 unter einem Windows 32-Bit
Für eine andere Ausrichtung der Struktur kann man "align" als Präfix 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 nachdem welches kleiner ist. Dies ist wie bei der "#pragma pack option" mit dem Microsoft Visual C++ Compiler.
DllStructCreate("short;int") ; Die Struktur ist 8 Bytes groß, der "int" beginnt ab Offset 4
DllStructCreate("align 2;short;int") ; Die Struktur ist 6 Bytes groß, der "int" beginnt ab Offset 2
DllStructCreate("byte;double") ; Die Struktur ist 16 Bytes groß, der "double" beginnt ab Offset 8
DllStructCreate("align 4;byte;double") ; Die Struktur ist 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.
Die Gesamtheit der anzuwendenden Ausrichtungsregeln:
Die Ausrichtung eines Arrays ist die gleiche wie die Ausrichtung eines der Elemente des Arrays.
Die Ausrichtung am Beginn einer Struktur ist die maximale Ausrichtung jedes einzelnen Mitglieds der Struktur.
Jedes Element in der Struktur ist anzuordnen gemäß der richtigen Ausrichtung, wie in der obigen Tabelle definiert, welche eine implizite Einbettung erfordert, in Abhängigkeit zum vorhergehenden Element.
Die Strukturgröße ist ein ganzzahliges Vielfaches ihrer Ausrichtung, was ein Auffüllen nach dem letzten Element erfordert.
DllCall, DllStructGetData, DllStructGetPtr, DllStructGetSize, DllStructSetData, IsDllStruct
#include <MsgBoxConstants.au3>
Example()
Func Example()
#cs Comments:
Erstellen Sie die folgende Struktur (C-Sprache)::
struct {
int var1;
unsigned char var2;
unsigned int var3;
char var4[128];
};
Schema:
------------------------------------
\ int \ byte \ uint \ char \
\ var1 \ var2 \ var3 \ var4 \
------------------------------------
#ce Comments:
; Weist einer lokalen konstanten Variablen die Definition einer Struktur zu (man sollte die Bemerkungen zu DllStructCreate sorgfältig durchlesen).
Local Const $tagSTRUCT1 = "struct;int var1;byte var2;uint var3;char var4[128];endstruct"
; Hinweis: Die Tag-Variable wird als Konstante deklariert, da sich ihr Wert bei keiner Skriptausführung ändern wird.
; Weist der Struktur eine lokale Variable zu.
Local $tSTRUCT1 = DllStructCreate($tagSTRUCT1)
; Wenn ein Fehler aufgetreten ist, den Fehlercode anzeigen und False zurückgeben.
If @error Then
MsgBox($MB_SYSTEMMODAL, "", "Error in DllStructCreate, Code: " & @error)
Return False
EndIf
; Setzt die Daten des Elements var1 (int) in $tSTRUCT1.
DllStructSetData($tSTRUCT1, "var1", -1) ; Oder 1 statt „var1“.
; Setz die Daten des Elements var2 (Byte) in $tSTRUCT1.
DllStructSetData($tSTRUCT1, 2, 255) ; Oder „var2“ anstelle von 2.
; Setzt die Daten des Elements var3 (uint) in $tSTRUCT1.
DllStructSetData($tSTRUCT1, "var3", -1) ; Der Wert -1 (signed int) wird in unsigned int umgewandelt.
; Oder 3 statt „var3“.
; Setzt die Daten des Elements var4 (Zeichen) in $tSTRUCT1.
DllStructSetData($tSTRUCT1, "var4", "Hallo") ; Oder 4 statt „var4“.
; Hinweis: Dieses Element kann bis zu 128 Zeichen enthalten.
; Ändert die Daten des Elements var4 (Zeichen) in $tSTRUCT1 am Index 1 des Zeichen-Arrays (Index beginnt bei 1).
DllStructSetData($tSTRUCT1, "var4", Asc("h"), 1)
; Zeigt die Ergebnisse an.
MsgBox($MB_SYSTEMMODAL, "", "Struct Size: " & DllStructGetSize($tSTRUCT1) & @CRLF & _
"Struct pointer: " & DllStructGetPtr($tSTRUCT1) & @CRLF & _
"Data:" & @CRLF & _
DllStructGetData($tSTRUCT1, 1) & @CRLF & _ ; Oder „var1“ anstelle von 1.
DllStructGetData($tSTRUCT1, "var2") & @CRLF & _ ; Oder 2 statt „var2“.
DllStructGetData($tSTRUCT1, 3) & @CRLF & _ ; Oder „var3“ anstelle von 3.
DllStructGetData($tSTRUCT1, 4)) ; Oder „var4“ anstelle von 4.
; Gibt die von der Struktur verwendeten Ressourcen frei.
$tSTRUCT1 = 0
EndFunc ;==>Example