Crée une structure style C/C++ à utiliser avec DllCall.
DllStructCreate ( Struct [, Pointer] )
Struct | Une chaîne représentant la structure à créer (Voir Remarques). |
Pointer | [optionnel] Si ce paramètre est renseigné la structure ne sera pas allouée dans la mémoire, mais utilisera le pointeur fourni. |
Succès: | Retourne une variable à utiliser dans les appels de DllStruct. |
Échec: | Définit @error <> 0. |
@error: | 1 = La variable passée à DllStructCreate n'était pas une chaîne. 2 = Il y a un type de donnée inconnu dans la chaîne passée. 3 = Impossible d'allouer la mémoire nécessaire pour la structure, ou Pointer = 0. 4 = Erreur d'allocation mémoire pour la chaîne passée. |
Type | Détails |
BYTE | caractère non signé 8bit (1 octet) |
BOOLEAN | caractère non signé 8bit (1 octet) |
CHAR | caractère ASCII 8bit (1 octet) |
WCHAR | caractère large UNICODE 16 bits (2 octets) |
SHORT | entier signé 16 bits (2 octets) |
USHORT | entier non signé 16 bits (2 octets) |
WORD | entier non signé 16 bits (2 octets) |
INT | entier signé 32 bits (4 octets) |
LONG | entier signé 32 bits (4 octets) |
BOOL | entier signé 32 bits (4 octets) |
UINT | entier non signé 32 bits (4 octets) |
ULONG | entier non signé 32 bits (4 octets) |
DWORD | entier non signé 32 bits (4 octets) |
INT64 | entier signé 64 bits (8 octets) |
UINT64 | entier non signé 64 bits (8 octets) |
PTR | pointeur 32 ou 64 bits (selon que la version x86 ou x64 de AutoIt est utilisée) |
HWND | pointeur 32 ou 64 bits (selon que la version x86 ou x64 de AutoIt est utilisée) |
HANDLE | pointeur 32 ou 64 bits (selon que la version x86 ou x64 de AutoIt est utilisée) |
FLOAT | nombre à virgule flottante 32 bits (4 octets) |
DOUBLE | nombre à virgule flottante 64 bits (8 octets) |
INT_PTR, LONG_PTR, LRESULT, LPARAM | entier signé 32 ou 64 bits (en fonction de la version x86 ou x64 de AutoIt) |
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM | entier non signé 32 ou 64 bits (en fonction de la version x86 ou x64 de AutoIt) |
STRUCT | Les types de données suivants seront alignés selon les règles de déclaration C. Voir ci-dessous. |
ENDSTRUCT | Fin de la collection des données. L'alignement peut se voir ci-dessous. |
ALIGN | limite de n octets pour aligner les données. |
Chaque type de données doit être séparé par un point-virgule ';'.
Créer des tableaux en ajoutant '[size]' après le type de données : DllStructCreate ("int;char[128]")
Un nom d'élément peut être ajouté comme dans une déclaration de type C: DllStructCreate ("int n;char buffer[128]").
Ce nom de donnée peut être utilisé à la place de l'élément dans d'autres fonctions DllStruct... Le 'dataname' doit être alphanumérique ou trait de soulignement.
Si une collection de types de données est défini comme dans une "struct{ }" d'une déclaration C, "STRUCT;...; ENDSTRUCT;" doit être utilisé.
Ceci doit être fait pour respecter l'alignement à l'intérieur de la création de la structure entière. Inutile si tous les types de données sont dans la structure définie puisque un alignement de structure implicite est fait.
DllStructCreate ("int; STRUCTURES; ptr; int; ENDSTRUCT; int") ; la structure est de 32 octets sous Windows 64-bit et 16 sous Windows 32 bits
DllStructCreate ("int; ptr; int; int"); la structure est de 24 octets sous Windows 64-bit et 16 sous Windows 32 bits
Pour utiliser un préfixe d'alignement différent de la structure avec le mot-clé 'align'. La valeur par défaut de n est 8. Les valeurs valides sont 1, 2, 4, 8, et 16. L'alignement d'un champ aura une limite qui est soit un multiple de n, soit un multiple de la taille du champ, la plus petite des deux valeurs . Ceci est équivalent à l'option #pragma avec le compilateur Visual C++ de Microsoft.
DllStructCreate("short;int"); la structure est de 8 octets, le "int" est à l'offset 4
DllStructCreate ("align 2;short;int"); la structure est de 6 octets, le "int" est à l'offset 2
DllStructCreate("byte;double"); la structure est de 16 octets, le «double» est à l'offset 8
DllStructCreate ("align 4;byte;double" ); la structure est de 12 octets, le «double» est à l'offset 4
Si un changement d'alignement est requis, "align" peut être utilisé avant le premier élément qui doit être changée.
"align" ou "align 8" conduit à l'alignement par défaut.
Pour libérer la mémoire allouée juste définir la variable de retour à 0.
Les règles d'alignement des ensembles s'appliquent:
L'alignement d'un tableau est le même que l'alignement de l'un des éléments du tableau.
L'alignement du début de la structure est l'alignement maximal de tous les champs individuels.
Chaque champ au sein de la structure est placée à son bon alignement tel que défini dans le tableau précédent, ce qui nécessite de combler implicitement, selon le champ précédent.
La taille de la structure est un multiple entier de l'alignement, ce qui nécessite de combler après le dernier élément.
DllCall, DllStructGetData, DllStructGetPtr, DllStructGetSize, DllStructSetData, IsDllStruct
#include <MsgBoxConstants.au3> Example() Func Example() #cs Commentaires: Crée la structure suivante (langage C): struct { int var1; unsigned char var2; unsigned int var3; char var4[128]; }; Schéma: ------------------------------------ \ int \ byte \ uint \ char \ \ var1 \ var2 \ var3 \ var4 \ ------------------------------------ #ce ; Assigne une constante locale avec la définition d'une structure (lire attentivement les remarques DllStructCreate). Local Const $tagSTRUCT1 = "struct;int var1;byte var2;uint var3;char var4[128];endstruct" ; Note: La variable $tag est déclarée comme Const parce que sa valeur ne changera pas pendant toute l'exécution du script. ; Assigne une variable locale avec la structure. Local $tSTRUCT1 = DllStructCreate($tagSTRUCT1) ; Si une erreur s'est produite, affiche le code d'erreur et retourne False. If @error Then MsgBox($MB_SYSTEMMODAL, "", "Erreur dans DllStructCreate, Code: " & @error) Return False EndIf ; Définit les données de l'élément var1 (int) dans $tSTRUCT1. DllStructSetData($tSTRUCT1, "var1", -1) ; Ou 1 à la place de "var1". ; Définit les données de l'élément var2 (octet) dans $tSTRUCT1. DllStructSetData($tSTRUCT1, 2, 255) ; Ou "var2" au lieu de 2. ; Définit les données de l'élément var3 (uint) dans $tSTRUCT1. DllStructSetData($tSTRUCT1, "var3", -1) ; Le -1 (Int signé) sera converti en un int non signé. ; Ou 3 au lieu de "var3". ; Définit les données de l'élément var4 (char) dans la $tSTRUCT1. DllStructSetData($tSTRUCT1, "var4", "Hello") ; Ou 4 au lieu de "var4". ; Remarque: Cet élément peut contenir jusqu'à 128 caractères. ; Modifie les données de l'élément var4 (char) dans $tSTRUCT1, à l'index 1 du tableau de caractères (de base 1). DllStructSetData($tSTRUCT1, "var4", Asc("h"), 1) ; Affiche les résultats. MsgBox($MB_SYSTEMMODAL, "", "Struct Size: " & DllStructGetSize($tSTRUCT1) & @CRLF & _ "Struct pointer: " & DllStructGetPtr($tSTRUCT1) & @CRLF & _ "Data:" & @CRLF & _ DllStructGetData($tSTRUCT1, 1) & @CRLF & _ ; Ou "var1" à la place de 1. DllStructGetData($tSTRUCT1, "var2") & @CRLF & _ ; Ou 2 à la place de "var2". DllStructGetData($tSTRUCT1, 3) & @CRLF & _ ; Ou "var3" à la place de 3. DllStructGetData($tSTRUCT1, 4)) ; Ou "var4" à la place de 4. ; Libére les ressources utilisées par la structure. $tSTRUCT1 = 0 EndFunc ;==>Example