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


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.

Функцию можно подключить через команду exect

1. Для действий со структурами используются переменные с приставкой $STRUCT_
    (переменные $var_ для структуры не используются)
2. Присвоение данных переменным производится с помощью команды Assign() с флагом flag=2 (создание переменной в глобальной области видимости)
3. Можно воспользоваться тегом :tegSTRUCT: , который будет заменён строкой, прописанной в TCIMG.ini в секции [TagStruct]
    tegSTRUCT - имя ключа, в котором прописана строка структуры.

Пример записи в командной строке:

exect=Assign('STRUCT_N',DllStructCreate('wchar[256]'),2)
exect=Assign('STRUCT_RECT',DllStructCreate(':tagRECT:'),2)

Пример записи в TCIMG.ini:

[TagStruct]
tagRECT=struct;long Left;long Top;long Right;long Bottom;endstruct
tagOSVERSIONINFO=struct;dword OSVersionInfoSize;dword MajorVersion;dword MinorVersion;dword BuildNumber;dword PlatformId;wchar CSDVersion[128];endstruct

См. также

DllCall, DllStructGetData, DllStructSetData, DllStructGetPtr, DllStructGetSize, IsDllStruct

Примеры:
 Как создать кнопку?


exect=$var_0=Assign('STRUCT_1',DllStructCreate('dword~~Size;hwnd~~hWndOwnder;handle~~hInstance;dword~~rgbResult;ptr~~CustColors;dword~~Flags;lparam~~lCustData;ptr~~lpfnHook;ptr~~lpTemplateName'),2)+Assign('STRUCT_2',DllStructCreate('dword[16]'),2)+DllStructSetData($STRUCT_1,'Size',DllStructGetSize($STRUCT_1))+DllStructSetData($STRUCT_1,'hWndOwnder',GUICreate(0,200,300,-1,-1))+DllStructSetData($STRUCT_1,'rgbResult','0xC5B248')+DllStructSetData($STRUCT_1,'CustColors',DllStructGetPtr($STRUCT_2))+DllStructSetData($STRUCT_1,'Flags',259)||$var_iyn=DllCall('comdlg32.dll','bool','ChooseColor','struct*',$STRUCT_1)[0]||$var_0=$var_iyn=0?_Exit():1||$var_num=DllStructGetData($STRUCT_1,'rgbResult')||$var_ibrg=Hex($var_num,6)||_ViewValues('$var_ibrg','BRG~~Color') ;; создание и запуск окна выбора цвета

exect=Assign('STRUCT_N',DllStructCreate('wchar[256]'),2)||$var_i=IsDllStruct($STRUCT_N)||_ViewValues($var_i) ;; пример проверки переменной типом данных DllStruct

exect=$var_0=Assign('STRUCT_N',DllStructCreate('struct;int~~var1;byte~~var2;uint~~var3;char~~var4[128];endstruct'),2)+DllStructSetData($STRUCT_N,1,-1)+DllStructSetData($STRUCT_N,'var2',255)+DllStructSetData($STRUCT_N,4,'Write-Data')||$var_s='Размер~~структуры:~~'&DllStructGetSize($STRUCT_N)&@CRLF&'Указатель~~структуры:~~'&DllStructGetPtr($STRUCT_N)&@CRLF&'Данные:'&@CRLF&DllStructGetData($STRUCT_N,1)&@CRLF&DllStructGetData($STRUCT_N,2)&@CRLF&DllStructGetData($STRUCT_N,3)&@CRLF&DllStructGetData($STRUCT_N,4)||_ViewValues('$var_s') ;; пример создания структуры, установки и получение данных

exect=$var_handle=WinGetHandle('[CLASS:TTOTAL_CMD]')||$var_0=Assign('STRUCT_RECT',DllStructCreate(':tagRECT:'),2)+DllCall('user32.dll','bool','GetWindowRect','hwnd',Eval('var_handle'),'struct*',$STRUCT_RECT)||$var_s='Координаты~~углов~~TC:'&@CRLF&'X1:~~'&DllStructGetData($STRUCT_RECT,'Left')&@CRLF&'X2:~~'&DllStructGetData($STRUCT_RECT,'Right')&@CRLF&'Y1:~~'&DllStructGetData($STRUCT_RECT,'Top')&@CRLF&'Y2:~~'&DllStructGetData($STRUCT_RECT,'Bottom')||_ViewValues('$var_s') ;; получение координат окна Total Commander

exect=$var_0=Assign('STRUCT_ICON',DllStructCreate('int'),2)+Assign('STRUCT_STRING',DllStructCreate('wchar[260]'),2)+DllStructSetData($STRUCT_STRING,1,@SystemDir&'\shell32.dll')||$var_iyn=DllCall('shell32.dll','int',62,'hwnd',GUICreate(0,400,400,-1,-1),'struct*',$STRUCT_STRING,'int',DllStructGetSize($STRUCT_STRING)/2,'struct*',$STRUCT_ICON)[0]||$var_0=$var_iyn=0?_Exit():1||$var_s=DllStructGetData($STRUCT_STRING,1)&','&DllStructGetData($STRUCT_ICON,1)||_ViewValues('$var_s','Путь~~и~~номер~~значка') ;; выбор значка в системном диалоге

exect=$var_0=Assign('STRUCT_1',DllStructCreate('wchar[256]'),2)+DllCall('Kernel32.dll','uint','GetTempFileNameW','wstr',@TempDir,'wstr','__','uint',0,'ptr',DllStructGetPtr($STRUCT_1))||$var_path=DllStructGetData($STRUCT_1,1)||_ViewValues('$var_path','temp_file') ;; получить временный файл


© Аверин Андрей для Total Commander Image  Averin-And@yandex.ru