Функция DllStructCreate

 ↑  ←  Описание функции


DllStructCreate

Создаёт структуру в стиле C/C++ для использования в DllCall.

DllStructCreate ( Struct [, Pointer ] )

Параметры

Struct Строка, представляющая создаваемую структуру (см. примечания).
Pointer [необязательный] Если структуре не выделена память, но используется указатель.

Возвращаемое значение

Успех:Возвращает переменную для использования вызова команд DllStruct.
Ошибка:Возвращает 0.
@error:0 = нет ошибок.
1 = Передаваемая в DllStructCreate переменная не является строкой.
2 = В переданной строке присутствует неизвестный тип данных.
3 = Не удалось выделить память, необходимую для структуры или указатель (Pointer) = 0.
4 = Ошибка выделения памяти для переданной строки.


Тип Подробно
BYTE 8 бит (1 байт) беззнаковый символ
BOOLEAN 8 бит (1 байт) беззнаковый символ
CHAR 8 бит (1 байт) ASCII символ
WCHAR 16 бит (2 байта) UNICODE широкий символ
short 16 бит (2 байта) знаковое целое
USHORT 16 бит (2 байта) беззнаковое целое
WORD 16 бит (2 байта) беззнаковое целое
int 32 бит (4 байта) знаковое целое
long 32 бит (4 байта) знаковое целое
BOOL 32 бит (4 байта) знаковое целое
UINT 32 бит (4 байта) беззнаковое целое
ULONG 32 бит (4 байта) беззнаковое целое
DWORD 32 бит (4 байт) беззнаковое целое
INT64 64 бит (8 байт) знаковое целое
UINT64 64 бит (8 байт) беззнаковое целое
ptr 32 или 64 бит беззнаковое целое (в зависимости от используемой версии AutoIt, x86 или x64)
HWND 32 бит (4 байта) целое
HANDLE 32 бит (4 байта) целое
float 32 бит (4 байта) с плавающей точкой
double 64 бит (8 байт) с плавающей точкой
INT_PTR, LONG_PTR, LRESULT, LPARAM 32 или 64 бит знаковое целое (в зависимости от используемой версии AutoIt, x86 или x64)
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM 32 или 64 бит беззнаковое целое (в зависимости от используемой версии AutoIt, x86 или x64)
STRUCT The following datatypes will be align according to C declaration rules. См. ниже.
ENDSTRUCT end of the collection datatypes. Padding can occurs see below.
ALIGN n bytes boundary where datatype must be aligned.

Примечания

Каждый тип данных должен быть разделен точкой с запятой ';'.

Создание массива добавлением '[size]' после типа данных: DllStructCreate("int;char[128]")

Добавляемые имена элементов имитируют объявление в стиле языка программирования C: DllStructCreate("int n;char buffer[128]").
Эти имена элементов можно использовать в других функциях DllStruct... Имена элементов должны быть буквенно-цифровые или подчеркивание.

If a collection of datatypes is defined as in a "struct{}" in C declaration, the "STRUCT; ...; ENDSTRUCT;" must be used.
This needs to be done to respect alignment inside the entire structure creation. No need if all datatypes are in the defined structure as an implicit structure alignment is done.

DllStructCreate("int;STRUCT;ptr;int;ENDSTRUCT;int") ; structure is 32 bytes under a Windows 64-Bit and 16 under Windows 32-Bit
DllStructCreate("int;ptr;int;int") ; structure is 24 bytes under a Windows 64-Bit and 16 under Windows 32-Bit

Для использования различных префиксов выравнивания структуры с выравниванием ключевых слов. По умолчанию значение n - 8. Правильные значения 1, 2, 4, 8, и 16. Выравнивание элемента будет находится на границе, которая также кратна n или кратна размеру элемента, в зависимости от меньшего. Это эквивалентно опции #pragma pack в компиляторе Microsoft Visual C++.

DllStructCreate("short;int")     ; структура 8 байт, "int" со смещением 4
DllStructCreate("align 2;short;int")     ; структура 6 байт, "int" со смещением 2

DllStructCreate("byte;double")     ; структура 16 байт, "double" со смещением 8
DllStructCreate("align 4;byte;double")     ; структура 12 байт, "double" со смещением 4


Если изменено выравнивание, то необходимо "align" использовать перед первым элементом, который должен быть изменён.
"align" или "align 8" приводит к выравниванию по умолчанию.

Чтобы освободить выделенную память просто установите возвращённую переменную в 0.

Применяется следующая совокупность правил выравнивания:

Выравнивание массива такое же, как выравнивание одного из элементов массива.

The alignment of the beginning of a structure is the maximum alignment of any individual member.
Each member within the structure is be placed at its proper alignment as defined in the previous table, which require implicit internal padding, depending on the previous member.

Structure size is an integral multiple of its alignment, which requires padding after the last member.

См. также

DllCall, DllStructGetData, DllStructSetData, DllStructGetPtr, DllStructGetSize, IsDllStruct

Пример

#cs
    Создаёт структуру (вид на языке Си)
    struct {
    int             var1;
    unsigned char   var2;
    unsigned int    var3;
    char            var4[128];
    }

    Schema:
    ------------------------------------
    \ int    \ byte   \ uint   \ char   \
     \   var1 \   var2 \   var3 \   var4 \
      ------------------------------------
#ce

; Local Const $tagSTRUCT = "int;ubyte;uint;char[128]" ; 3.3.6.1
; Local Const $tagSTRUCT = "struct;int;byte;uint;char[128];endstruct" ; 3.3.8.1, без имён элементов (полей) структуры
Local Const $tagSTRUCT = "struct;int var1;byte var2;uint var3;char var4[128];endstruct" ; 3.3.8.1, с именами элементов (полей) структуры
$tStruct = DllStructCreate($tagSTRUCT)
If @error Then
    MsgBox(4096, "", "Ошибка создания структуры,  @error = " & @error)
    Exit
EndIf

#cs
    Устанавливает данные в структуру (вид на языке Си)
    struct.var1 = -1;
    struct.var2 = 255;
    struct.var3 = INT_MAX; -1 will be typecasted to (unsigned int)
    strcpy(struct.var4,"Приветствие");
    struct.var4[0]  = 'п';
#ce
DllStructSetData($tStruct, 1, -1) ; или var1 вместо 1
DllStructSetData($tStruct, 2, 255) ; или var2 вместо 2
DllStructSetData($tStruct, 3, -1) ; или var3 вместо 3
DllStructSetData($tStruct, 4, "Приветствие") ; или var4 вместо 4
DllStructSetData($tStruct, 4, Asc("п"), 1)

;   Отображает информацию в структуре
MsgBox(4096, "Сообщение", "Размер структуры: " & DllStructGetSize($tStruct) & @CRLF & _
        "Указатель структуры: " & DllStructGetPtr($tStruct) & @CRLF & _
        "Данные:" & @CRLF & _
        DllStructGetData($tStruct, 1) & @CRLF & _
        DllStructGetData($tStruct, 2) & @CRLF & _
        DllStructGetData($tStruct, 3) & @CRLF & _
        DllStructGetData($tStruct, 4))

$tStruct = 0 ; Освобождает выделенную для структуры память, если потребуется.
;  При завершении скрипта или функции (если локальная структура) освобождать не требуется.