基 础 函 数 参 考
DllStructCreate
创建 C/C++ 数据结构供 DllCall 使用.
参 数
结构 |
字符串表示的数据结构 (见备注). |
指针 |
[可选参数] 如果指定的数据结构不能分配内存, 则使用此指针提供. |
返 回 值
成功: |
返回供 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