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