Functions > Process >


DllStructCreate

Crée une structure style C/C++ à utiliser avec DllCall.

DllStructCreate ( Struct [, Pointer] )

Paramètres

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.

Valeur de retour

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.

Remarques

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.

En relation

DllCall, DllStructGetData, DllStructGetPtr, DllStructGetSize, DllStructSetData, IsDllStruct

Exemple

#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