基 礎 函 數(shù) 參 考
DllStructCreate
創(chuàng)建 C/C++ 數(shù)據(jù)結(jié)構(gòu)供 DllCall 使用.
參 數(shù)
結(jié)構(gòu) |
字符串表示的數(shù)據(jù)結(jié)構(gòu) (見備注). |
指針 |
[可選參數(shù)] 如果指定的數(shù)據(jù)結(jié)構(gòu)不能分配內(nèi)存, 則使用此指針提供. |
返 回 值
成功: |
返回供 DllStruct 調(diào)用的變量. |
失敗: |
返回 0. |
@Error: |
0 = 無錯誤. |
|
1 = 傳遞給 DllStructCreate 的變量不是字符串. |
|
2 = 傳遞的字符串中有一個未知的數(shù)據(jù)類型. |
|
3 = 數(shù)據(jù)結(jié)構(gòu)不能分配內(nèi)存, 或指針 = 0. |
|
4 = 傳遞的字串分配內(nèi)存錯誤. |
類型
|
詳細信息
|
BYTE |
8 位(1字節(jié)) 無符號字符 |
BOOLEAN |
8 位(1字節(jié)) 無符號字符 |
CHAR |
8 位(1字節(jié)) ASCII 字符 |
WCHAR |
16 位(2字節(jié)) UNICODE 寬字符 |
short |
16 位(2字節(jié)) 帶符號整數(shù) |
USHORT |
16 位(2字節(jié)) 無符號整數(shù) |
WORD |
16 位(2字節(jié)) 無符號整數(shù) |
int |
32 位(4字節(jié)) 帶符號整數(shù) |
long |
32 位(4字節(jié)) 帶符號整數(shù) |
BOOL |
32 位(4字節(jié)) 帶符號整數(shù) |
UINT |
32 位(4字節(jié)) 無符號整數(shù) |
ULONG |
32 位(4字節(jié)) 無符號整數(shù) |
DWORD |
32 位(4字節(jié)) 無符號整數(shù) |
INT64 |
64 位(8字節(jié)) 帶符號整數(shù) |
UINT64 |
64 位(8字節(jié)) 無符號整數(shù) |
ptr |
32 或 64 位無符號整數(shù) (取決于使用的 x86 或 x64 AutoIt 版本) |
HWND |
32 位(4字節(jié)) 整數(shù) |
HANDLE |
32 位(4字節(jié)) 整數(shù) |
float |
32 位(4字節(jié)) 浮點數(shù) |
double |
64 位(8字節(jié)) 浮點數(shù) |
INT_PTR, LONG_PTR, LRESULT, LPARAM |
32 或 64 位帶符號整數(shù) (取決于使用的 x86 或 x64 AutoIt 版本) |
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM |
32 或 64 位無符號整數(shù) (取決于使用的 x86 或 x64 AutoIt 版本) |
STRUCT |
以下數(shù)據(jù)類型將根據(jù) C 語言聲明的規(guī)則調(diào)整. 見下文. |
ENDSTRUCT |
結(jié)束收集數(shù)據(jù)類型. 可以發(fā)生填充. 見下文. |
ALIGN |
n 數(shù)據(jù)類型必須對齊的字節(jié)界限. |
備 注
每個數(shù)據(jù)類型必須由分號 ';' 分隔.
創(chuàng)建數(shù)組,在數(shù)據(jù)類型后面添加 '[大小]' 如: DllStructCreate("int;char[128]")
元素名稱可以添加 C 結(jié)構(gòu)的申明. 如: DllStructCreate("int n;char buffer[128]").
數(shù)據(jù)名稱可以用其它 DllStruct... 函數(shù)中的元素代替. 數(shù)據(jù)名稱必須為英文字母或下劃線開頭.
如果收集的數(shù)據(jù)類型被定義為 C 聲明的 "struct{}" 結(jié)構(gòu), 則必須使用 "STRUCT; ...;
ENDSTRUCT;".
需要做的內(nèi)部調(diào)整必須尊重創(chuàng)建的整個結(jié)構(gòu). 所有數(shù)據(jù)類型結(jié)構(gòu)調(diào)整無需作為隱式定義的結(jié)構(gòu)完成.
DllStructCreate("int;STRUCT;ptr;int;ENDSTRUCT;int") ; 結(jié)構(gòu)在 Windows
X64 為 32 字節(jié); 在 Windows X32 為 16 字節(jié).
DllStructCreate("int;ptr;int;int") ; 結(jié)構(gòu)在 Windows X64 為 24 字節(jié); 在
Windows X32 為 16 字節(jié).
結(jié)構(gòu)調(diào)整使用不同的對齊前綴與關(guān)鍵字. 默認 n 為 8. 有效值為 1, 2, 4, 8, 與 16.
結(jié)構(gòu)元素對齊將根據(jù)邊界決定, 要么是一個 n 的倍數(shù), 要么是結(jié)構(gòu)元素大小的整倍數(shù),取較小值.
這相當于 Microsoft Visual C++ 編譯器的 #pragma pack 選項.
DllStructCreate("short;int") ; 結(jié)構(gòu)為 8 字節(jié), "int" 偏移量 4
DllStructCreate("align 2;short;int") ; 結(jié)構(gòu)為 6 字節(jié), "int" 偏移量 2
DllStructCreate("byte;double") ; 結(jié)構(gòu)為 16 字節(jié), "double" 偏移量 8
DllStructCreate("align 4;byte;double") ; 結(jié)構(gòu)為 12 字節(jié), "double" 偏移量
4
如果對齊 "align" 需要改變, 可以使用改變之前的第一個元素.
"align" 或 "align 8" 為默認對齊方式.
要釋放分配的內(nèi)存,只需將返回的變量設置為 0.
以下規(guī)則適用于總對齊:
數(shù)組的對齊與數(shù)組中的一個元素對齊是一樣的.
結(jié)構(gòu)的開始對齊是最大限度的對齊任何一個元素.
如前面表中定義的, 結(jié)構(gòu)中的每個成員都被放置在其適當?shù)膶R位置, 需要隱式內(nèi)部填充, 取決于前一個元素.
結(jié)構(gòu)的大小是其對齊的整數(shù)倍, 這就需要填充后的最后一個元素.
相 關(guān) 函 數(shù)
DllCall, DllStructGetData, DllStructSetData, DllStructGetPtr, DllStructGetSize, IsDllStruct
函 數(shù) 示 例
;=========================================================
; 創(chuàng)建數(shù)據(jù)結(jié)構(gòu)
; 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 發(fā)生錯誤 " &
@error);
Exit
EndIf
;=========================================================
; 設置數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)
; 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)
;=========================================================
; 顯示數(shù)據(jù)結(jié)構(gòu)的信息
;=========================================================
MsgBox(0, "DllStruct", "數(shù)據(jù)結(jié)構(gòu)大小: " & DllStructGetSize($a) & @CRLF & _
"數(shù)據(jù)結(jié)構(gòu)指針: " & DllStructGetPtr($a) & @CRLF & _
"數(shù)據(jù):" & @CRLF & _
DllStructGetData($a, 1) & @CRLF & _
DllStructGetData($a, 2) & @CRLF & _
DllStructGetData($a, 3) & @CRLF & _
DllStructGetData($a, 4))
;=========================================================
; 釋放為數(shù)據(jù)結(jié)構(gòu)分配的內(nèi)存
;=========================================================
$a = 0