Function Reference

DllStructCreate

Creates a C/C++ style structure to be used in DllCall.

DllStructCreate ( "Struct" [,Pointer] )

 

Parameters

"Struct" A string representing the structure to create (See Remarks).
Pointer If supplied the struct will not allocate memory but use the pointer supplied.

 

Return Value

Success: A variable for use with DllStruct calls.
Failure: 0.
@Error: 0 = No Error.
1 = Variable passed to DllStructCreate was not a string.
2 = There is an unknown Data Type in the string passed.
3 = Failed to allocate the memory needed for the struct, or Pointer = 0.
4 = Error allocating memory for the passed string.


Type Details
byte 8bit(1byte) signed char
ubyte 8bit(1byte) unsigned char
char 8bit(1byte) ASCII char
wchar 16bit(2byte) Wide char
short 16bit(2bytes) signed integer
ushort 16bit(2bytes) unsigned integer
int 32bit(4bytes) signed integer
uint 32bit(4bytes) unsigned integer
long 32bit(4bytes) signed integer
ulong 32bit(4bytes) unsigned integer
dword 32bit(4bytes) unsigned integer
ptr 32bit(4bytes) integer
hwnd 32bit(4bytes) integer
float 32bit(4bytes) floating point
double 64bit(8bytes) floating point
int64 64bit(8bytes) signed integer
uint64 64bit(8bytes) unsigned integer
int_ptr 32 or 64bit signed integer (depending on if the x86 or x64 version of AutoIt is used)
uint_ptr 32 or 64bit signed integer (depending on if the x86 or x64 version of AutoIt is used)
long_ptr 32 or 64bit unsigned integer (depending on if the x86 or x64 version of AutoIt is used)
ulong_ptr 32 or 64bit unsigned integer (depending on if the x86 or x64 version of AutoIt is used)

 

Remarks

Each data type must be separated by a semi-colon ';'. Create arrays by adding '[size]' after the data type.
DllStructCreate("int;char[128]"). An elementname can be added similar to a C-style declaration DllStructCreate("int n;char buffer[128]"). This dataname can be used in place of the element in other DllStruct... functions.

By default, a structure alignment of 8 is used (to be consistent with general Microsoft compilers and APIs). To use a different alignment prefix the structure with the align keyword - valid alignments are 1,2,4,8 and 16:
DllStructCreate("short;int") ; structure is 8 bytes, the "int" is at offset 4
DllStructCreate("align 2;short;int") ; structure is 6 bytes, the "int" is at offset 2

To release allocated memory just set the returned variable to 0.

 

Related

DllCall, DllStructCreate, DllStructGetData, DllStructSetData, DllStructGetPtr

 

Example


;=========================================================
;   Create the struct
;   struct {
;       int             var1;
;       unsigned char   var2;
;       unsigned int    var3;
;       char            var4[128];
;   }
;=========================================================
$str        = "int var1;ubyte var2;uint var3;char var4[128]"
$a          = DllStructCreate($str)
if @error Then
    MsgBox(0,"","Error in DllStructCreate " & @error);
    exit
endif

;=========================================================
;   Set data in the struct
;   struct.var1 = -1;
;   struct.var2 = 255;
;   struct.var3 = INT_MAX; -1 will be typecasted to (unsigned int)
;   strcpy(struct.var4,"Hello");
;   struct.var4[0]  = 'h';
;=========================================================
DllStructSetData($a,"var1",-1)
DllStructSetData($a,"var2",255)
DllStructSetData($a,"var3",-1)
DllStructSetData($a,"var4","Hello")
DllStructSetData($a,"var4",Asc("h"),1)

;=========================================================
;   Display info in the struct
;=========================================================
MsgBox(0,"DllStruct","Struct Size: " & DllStructGetSize($a) & @CRLF & _
        "Struct pointer: " & DllStructGetPtr($a) & @CRLF & _
        "Data:" & @CRLF & _
        DllStructGetData($a,1) & @CRLF & _
        DllStructGetData($a,2) & @CRLF & _
        DllStructGetData($a,3) & @CRLF & _
        DllStructGetData($a,4))

;=========================================================
;   Free the memory allocated for the struct if needed
;=========================================================
$a=0