Function Reference

首页  后退  前进

DllStructCreate

 

创建 C/C++ 数据结构供 DllCall 使用.

 

DllStructCreate ( Struct [, Pointer] )

参数

Struct

字符串表示的数据结构 (见备注).

Pointer

[可选] 如果指定的数据结构不能分配内存, 则使用此指针提供.

返回值

成功:

返回供 DllStruct 调用的变量.

失败:

设置 @error 为非 0 值:

@error:

1 = 传递给 DllStructCreate 的变量不是字符串.

2 = 传递的字符串中有一个未知的数据类型.

3 = 数据结构不能分配内存, 或指针 = 0.

4 = 传递的字串分配内存错误.

 

类型

详细信息

BYTE

8 位(1字节) 无符号字符. UTF-8 编码单位. "汉字"的 UTF-8 编码需要6个字节.

BOOLEAN

8 位(1字节) 无符号字符

CHAR

8 位(1字节) ASCII 字符

WCHAR

16 位(2字节) UNICODE 宽字符

SHORT

16 位(2字节) 带符号整数

USHORT

16 位(2字节) 无符号整数

WORD

16 位(2字节) 无符号整数. UTF-16 编码单位. "汉字"的 UTF-16 编码需要两个 WORD, 大小是 4 个字节.

INT

32 位(4字节) 带符号整数

LONG

32 位(4字节) 带符号整数

BOOL

32 位(4字节) 带符号整数

UINT

32 位(4字节) 无符号整数

ULONG

32 位(4字节) 无符号整数

DWORD

32 位(4字节) 无符号整数. UTF-32 编码单位. "汉字"的 UTF-32 编码需要两个 DWORD, 大小是 8 个字节

INT64

64 位(8字节) 带符号整数

UINT64

64 位(8字节) 无符号整数

PTR

32 或 64 位指针 (取决于 AutoIt 使用于 x86 或 x64 版本)

HWND

32 或 64 位指针 (取决于 AutoIt 使用于 x86 或 x64 版本)

HANDLE

32 或 64 位指针 (取决于 AutoIt 使用于 x86 或 x64 版本)

FLOAT

32 位(4字节) 浮点数

DOUBLE

64 位(8字节) 浮点数

INT_PTR, LONG_PTR, LRESULT, LPARAM

32 或 64 位带符号整数 (取决于使用的 x86 或 x64 AutoIt 版本)

UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM

32 或 64 位无符号整数 (取决于使用的 x86 或 x64 AutoIt 版本)

STRUCT

以下数据类型将根据 C 语言声明的规则调整. 见下文.

ENDSTRUCT

结束收集数据类型. 可以发生填充. 见下文.

ALIGN

n 数据类型必须对齐的字节界限.

备注

每个数据类型必须由分号 ';' 分隔.

 

创建数组,在数据类型后面添加 [大小] 如: DllStructCreate("int;char[128]")

 

元素名称可以添加 C 结构的申明. 如: DllStructCreate("int n;char buffer[128]").

数据名称可以用其它 DllStruct... 函数中的元素代替. 数据名称必须为英文字母或下划线开头.

 

如果收集的数据类型被定义为 C 声明的 "struct{}" 结构, 则必须使用 "STRUCT; ...; ENDSTRUCT;".

需要做的内部调整必须尊重创建的整个结构. 所有数据类型结构调整无需作为隐式定义的结构完成.

 

DllStructCreate("int;STRUCT;ptr;int;ENDSTRUCT;int")    ; 结构在 Windows X64 为 32 字节; 在 Windows X32 为 16 字节

DllStructCreate("int;ptr;int;int")    ; 结构在 Windows X64 为 24 字节; 在 Windows X32 为 16 字节

 

结构调整使用不同的对齐前缀与关键字. 默认 n 为 8. 有效值为 1, 2, 4, 8, 与 16.

结构元素对齐将根据边界决定, 要么是一个 n 的倍数, 要么是结构元素大小的整倍数, 取较小值.

这相当于 Microsoft Visual C++ 编译器的 #pragma pack 选项.

 

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.

 

以下规则适用于总对齐:

 

数组的对齐与数组中的一个元素对齐是一样的.

 

结构的开始对齐是最大限度的对齐任何一个元素.

如前面表中定义的, 结构中的每个成员都被放置在其适当的对齐位置, 需要隐式内部填充, 取决于前一个元素.

 

结构的大小是其对齐的整数倍, 这就需要填充后的最后一个元素.

 

该函数可以通过exect命令调用.

1. 对于具有结构的操作,具有前缀$STRUCT_的变量

   (不使用变量$var_)

2. 使用标志flag=2的Assign()命令完成向变量分配数据 (在全局范围内创建一个变量)

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, DllStructGetPtr, DllStructGetSize, DllStructSetData, IsDllStruct

函数示例

#include <MsgBoxConstants.au3>
Example()
Func Example()
    #cs Comments:
    Create the following structure (C language):
    struct {
        int var1;
        unsigned char var2;
        unsigned int var3;
        char var4[128];
    };
    Schema:
    ------------------------------------
    \ int    \ byte   \ uint   \ char   \
     \   var1 \   var2 \   var3 \   var4 \
      ------------------------------------
    #ce
    ; Assign a Local constant variable the definition of a structure (read carefully the DllStructCreate remarks).
    Local Const $tagSTRUCT1 = "struct;int var1;byte var2;uint var3;char var4[128];endstruct"
    ; Note: The tag variable is declared as Constant because its value will never change for any script execution.
    ; Assign a Local variable the structure.
    Local $tSTRUCT1 = DllStructCreate($tagSTRUCT1)
    ; If an error occurred display the error code and return False.
    If @error Then
        MsgBox($MB_SYSTEMMODAL, "", "Error in DllStructCreate, Code: " & @error)
        Return False
    EndIf
    ; Set the data of the element var1 (int) in the $tSTRUCT1.
    DllStructSetData($tSTRUCT1, "var1", -1) ; Or 1 instead of "var1".
    ; Set the data of the element var2 (byte) in the $tSTRUCT1.
    DllStructSetData($tSTRUCT1, 2, 255) ; Or "var2" instead of 2.
    ; Set the data of the element var3 (uint) in the $tSTRUCT1.
    DllStructSetData($tSTRUCT1, "var3", -1) ; The -1 (signed int) will be typecasted to unsigned int.
    ; Or 3 instead of "var3".
    ; Set the data of the element var4 (char) in the $tSTRUCT1.
    DllStructSetData($tSTRUCT1, "var4", "Hello") ; Or 4 instead of "var4".
    ; Note: This element can contain up to 128 characters.
    ; Change the data of the element var4 (char) in the $tSTRUCT1, at the index 1 of the char array (1 based index).
    DllStructSetData($tSTRUCT1, "var4", Asc("h"), 1)
    ; Display the results.
    MsgBox($MB_SYSTEMMODAL, "", "Struct Size: " & DllStructGetSize($tSTRUCT1) & @CRLF & _
            "Struct pointer: " & DllStructGetPtr($tSTRUCT1) & @CRLF & _
            "Data:" & @CRLF & _
            DllStructGetData($tSTRUCT1, 1) & @CRLF & _ ; Or "var1" instead of 1.
            DllStructGetData($tSTRUCT1, "var2") & @CRLF & _ ; Or 2 instead of "var2".
            DllStructGetData($tSTRUCT1, 3) & @CRLF & _ ; Or "var3" instead of 3.
            DllStructGetData($tSTRUCT1, 4)) ; Or "var4" instead of 4.
    ; Release the resources used by the structure.
    $tSTRUCT1 = 0
EndFunc   ;==>Example

----------------------------------------

 

exect=$var_0=Assign('STRUCT_1',create.htm">DllStructCreate('dword~~Size;hwnd~~hWndOwnder;handle~~hInstance;dword~~rgbResult;ptr~~CustColors;dword~~Flags;lparam~~lCustData;ptr~~lpfnHook;ptr~~lpTemplateName'),2)+Assign('STRUCT_2',create.htm">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',create.htm">DllStructCreate('wchar[256]'),2)||$var_i=IsDllStruct($STRUCT_N)||_ViewValues($var_i) ;; 通过数据类型DllStruct检查变量的示例

 

exect=$var_0=Assign('STRUCT_N',create.htm">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',create.htm">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',create.htm">DllStructCreate('int'),2)+Assign('STRUCT_STRING',create.htm">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','Путь~~и~~номер~~значка') ;; 在系统对话框中选择一个图标