Function Reference |
首页 后退 前进 |
DllStructCreate
创建 C/C++ 数据结构供 DllCall 使用.
DllStructCreate ( Struct [, Pointer] ) 参数
返回值
备注 每个数据类型必须由分号 ';' 分隔.
创建数组,在数据类型后面添加 [大小] 如: 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.
以下规则适用于总对齐:
数组的对齐与数组中的一个元素对齐是一样的.
结构的开始对齐是最大限度的对齐任何一个元素. 如前面表中定义的, 结构中的每个成员都被放置在其适当的对齐位置, 需要隐式内部填充, 取决于前一个元素.
结构的大小是其对齐的整数倍, 这就需要填充后的最后一个元素.
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> ----------------------------------------
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','Путь~~и~~номер~~значка') ;; 在系统对话框中选择一个图标
|