Главная

Назад к списку функции

 

 

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... Имена элементов должны быть буквенно-цифровые или подчеркивание.

Для использования различных префиксов выравнивания структуры с выравниванием ключевых слов. По умолчанию значение 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.
 

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

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

См. также

DllCallDllStructGetDataDllStructSetDataDllStructGetPtrDllStructGetSizeIsDllStruct

Пример

 

#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/
Категория: Описание функций AutoIt Добавил: Grek (05.01.2015) | | Теги: DllStructCreate
Всего комментариев: 0