函数参考
DllCall
动态调用指定DLL(动态链接库)文件中的函数.
参数
dll |
要使用的 DLL 文件名,例如 "user32.dll".也可以使用由 DllOpen 获得的句柄(请查看下面的 注意 部分). |
返回值类型 |
函数的返回值类型(请查看下面的 注意 部分). |
函数名称 |
调用DLL文件里面的函数名称, 如: "MessageBox" 或者使用序号, 如. 62 |
类型1 |
[可选参数] 参数的数据类型(请查看下面的 注意 部分). |
参数1 |
[可选参数] 实参(请查看下面的 注意 部分). |
类型 n |
[可选参数] 第n个参数的数据类型(请查看下面的 注意 部分). |
参数 n |
[可选参数] 第n个参数的实参(请查看下面的 注意 部分). |
有效类型为:
类型 |
详细信息 |
none |
没有值 (仅用作无返回值函数的返回类型,这点跟C语言中的void类似) |
BYTE |
无符号 8 位(bit)整数 |
BOOLEAN |
无符号 8 位(bit)整数 |
short |
16 位整数 |
USHORT |
无符号16 位整数 |
WORD |
无符号16 位整数 |
int |
32 位整数 |
long |
32 位整数 |
BOOL |
32 位整数 |
UINT |
无符号 32 位整数 |
ULONG |
无符号 32 位整数 |
DWORD |
无符号 32 位整数 |
INT64 |
64 位整数 |
UINT64 |
无符号 64 位整数 |
ptr |
常规指针(void *) |
HWND |
窗口句柄(指针) |
HANDLE |
一个句柄(指针) |
float |
单精度浮点数 |
double |
双精度浮点数 |
INT_PTR, LONG_PTR, LRESULT, LPARAM |
一个大型整数指针.(目前x86,x64版本AutoIt都可以使用). |
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM |
一个大型无符号整数指针.(目前x86,x64版本AutoIt都可以使用). |
str |
ANSI 字符串(至少将分配 65536 个字符,以保证AutoIt不会溢出). |
wstr |
UNICODE 宽字符串(至少将分配 65536 个字符,以保证AutoIt不会溢出). |
struct |
使用 DllStructCreate() 创建的数据结构 |
* |
传递一个其它类型(添加一个*到末尾.) 例如 "int*" 传递一个指针到 "int" 类型. |
从 Windows API 类型转换为 AutoIt 类型:
WINDOWS API 类型 |
AutoIt 类型 |
LPCSTR/LPSTR |
str |
LPCWSTR/LPWSTR |
wstr |
LPVOID |
ptr |
LPxyz |
xyz* |
HINSTANCE |
handle |
HRESULT |
long |
LONGLONG/LARGE_INTEGER |
INT64 |
ULONGLONG/ULARGE_INTEGER |
UINT64 |
SIZE_T |
ULONG_PTR |
如果要使用嵌套的数据结构(数据结构中包含数据结构)你必须重新定义嵌套的数据结构. 举个例子,一个数据结构包含两个指针数据结构("long;long") ,必须声明为 "long;long;long;long". 最前面的两个 long 值相当于第一个指针数据结构,后面的两个值相当于第二个数据结构.(thesnoW:比C更复杂了...)
了解更多的 Windows API 类型,请参考 MSDN.
返回值
成功: |
@error = 0. |
失败: |
设置 @error |
@error: |
1 不能使用这个DLL文件, |
|
2 未知 "返回值类型", |
|
3 未在DLL文件中找到这个"函数". |
|
4 参数数量错误. |
|
5 无效参数. |
参考注意项目.
注意/说明
如果dll使用的是一个文件名,这个DLL将会被自动载入,并在调用结束后关闭并卸载. 如果您想手动控制载入或者卸载一个dll文件,您需要使用 DllOpen 和 DllClose 操作DLL句柄代替dll文件名.
默认情况下, AutoIt 使用 'stdcall' 调用方式. 要使用 'cdecl' 方式调用,请在返回值类型后面加上 ':cdecl' .
DllCall("SQLite.dll", "int:cdecl", "sqlite3_open", "str", $sDatabase_Filename , "long*", 0).
默认情况下, AutoIt 尝试使用 ANSI 版本的函数名, 例如. MessageBoxA 为尝试调用 MessageBox 所得到的函数名. 要调用 unicode 版本的函数,请使用 MessageBoxW.(注意:这里是指如果存在的情况下,虽然微软的函数都带有ANSI和UNICODE版本的函数,但是不保证其它DLL也带有)
如果函数调用失败,将会设置 @error 为 1.反之将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数).
$return[0] = 函数的返回值
$return[1] = 参数1
$return[2] = 参数2
...
$return[n] = 参数n
相关
DllCallbackFree, DllCallbackGetPtr, DllCallbackRegister, DllOpen, DllClose, DllStructCreate, DllStructGetPtr
示例/演示
; *******************************************************
; 示例 1 - 直接调用 MessageBox API
; *******************************************************
Local $result = DllCall("user32.dll", "int", "MessageBox", "hwnd", 0, "str", "若干文字", "str", "若干标题", "int", 0)
; *******************************************************
; 示例 2 - 调用一个函数修改参数
; *******************************************************
Local $hwnd = WinGetHandle("[CLASS:Notepad]")
$result = DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hwnd, "str", "", "int", 32768)
MsgBox(4096, "", $result[0]) ; 返回的字符数
MsgBox(4096, "", $result[2]) ; 在参数 2 返回的文本
; *******************************************************
; 示例 3 - 显示系统更改图标窗口
; *******************************************************
Local $sFileName = @SystemDir & '\shell32.dll'
; 创建一个数据结构储存图标索引
Local $stIcon = DllStructCreate("int")
Local $stString = DllStructCreate("wchar[260]")
Local $structsize = DllStructGetSize($stString) / 2
DllStructSetData($stString, 1, $sFileName)
; 运行更改图标窗口 - '62' 是这个函数的顺序值
DllCall("shell32.dll", "none", 62, "hwnd", 0, "ptr", DllStructGetPtr($stString), "int", $structsize, "ptr", DllStructGetPtr($stIcon))
$sFileName = DllStructGetData($stString, 1)
Local $nIconIndex = DllStructGetData($stIcon, 1)
; 显示文件名和图标索引
MsgBox(4096, "信息", "最后选择的文件: " & $sFileName & @LF & "图标索引: " & $nIconIndex)