DllStructCreate
Создаёт структуру в стиле C/C++ для использования в DllCall.
Параметры
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... Имена элементов должны быть буквенно-цифровые или подчеркивание.
Для использования различных префиксов выравнивания структуры с выравниванием ключевых слов. По умолчанию значение 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.
Применяется следующая совокупность правил выравнивания:
Выравнивание массива такое же, как выравнивание одного из элементов массива.
См. также
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 ; Освобождает выделенную для структуры память, если потребуется.
; При завершении скрипта или функции (если локальная структура) освобождать не требуется.
Источник: http://dayzev.ucoz.ru/
|