基 础 函 数 参 考


DllStructCreate

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

DllStructCreate ( 结构 [, 指针] )

参 数

结构 字符串表示的数据结构 (见备注).
指针 [可选参数] 如果指定的数据结构不能分配内存, 则使用此指针提供.

返 回 值

成功: 返回供 DllStruct 调用的变量.
失败: 返回 0.
@Error: 0 = 无错误.
1 = 传递给 DllStructCreate 的变量不是字符串.
2 = 传递的字符串中有一个未知的数据类型.
3 = 数据结构不能分配内存, 或指针 = 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 位无符号整数 (取决于使用的 x86 或 x64 AutoIt 版本)
HWND 32 位(4字节) 整数
HANDLE 32 位(4字节) 整数
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.

以下规则适用于总对齐:

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

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

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

相 关 函 数

DllCall, DllStructGetData, DllStructSetData, DllStructGetPtr, DllStructGetSize, IsDllStruct

函 数 示 例


;=========================================================
;   创建数据结构
;   struct {
;       int             var1;
;       unsigned char   var2;
;       unsigned int    var3;
;       char            var4[128];
;   }
;=========================================================
Local $str = "int var1;byte var2;uint var3;char var4[128]"
Local $a = DllStructCreate($str)
If @error Then
    MsgBox(0, "", "DllStructCreate 发生错误 " & @error);
    Exit
EndIf

;=========================================================
;   设置数据结构中的数据
;   struct.var1 = -1;
;   struct.var2 = 255;
;   struct.var3 = INT_MAX; -1 将自动确定类型(无符号 int)
;   strcpy(struct.var4,"Hello");
;   struct.var4[0]  = 'h';
;=========================================================
DllStructSetData($a, "var1", -1)
DllStructSetData($a, "var2", 255)
DllStructSetData($a, "var3", -1)
DllStructSetData($a, "var4", "Hello")
DllStructSetData($a, "var4", Asc("h"), 1)

;=========================================================
;   显示数据结构的信息
;=========================================================
MsgBox(0, "DllStruct", "数据结构大小: " & DllStructGetSize($a) & @CRLF & _
        "数据结构指针: " & DllStructGetPtr($a) & @CRLF & _
        "数据:" & @CRLF & _
        DllStructGetData($a, 1) & @CRLF & _
        DllStructGetData($a, 2) & @CRLF & _
        DllStructGetData($a, 3) & @CRLF & _
        DllStructGetData($a, 4))

;=========================================================
;   释放为数据结构分配的内存
;=========================================================
$a = 0

provider with jb51.net (unicode)