函数参考


DllCall

动态调用指定DLL(动态链接库)文件中的函数.

DllCall ( "dll", "返回值类型", "函数名称" [, 类型1, 参数1[, 类型n, 参数n]] )

参数

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)