基 础 函 数 参 考


DllCall

调用 DLL 文件中的函数.

DllCall ( "文件", "返回类型", "函数" [, "类型 1", 参数 1[, "类型 n", 参数 n]] )

参 数

文件 DLL 文件名. 例如 "user32.dll". 也可使用由 DllOpen 返回的句柄 (见备注).
返回类型 函数的返回类型 (见下文).
函数 DLL 文件内的函数名称, 例如 "MessageBox" 或序号值, 例如 62.
类型1 [可选参数] 第一个类型参数 (见备注).
参数1 [可选参数] 第一个实际参数 (见备注).
类型n [可选参数] 第 n 个类型参数 (见备注).
参数n [可选参数] 第 n 个实际参数 (见备注).

类型值:
类型 描述
none 没有值 (用于只有一个有效返回的类型 - 相当于 C 语言的 void)
BYTE 无符号 8 位整数
BOOLEAN 无符号 8 位整数
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 个字符).
wstr UNICODE 宽字符串 (不超过 65536 个字符).
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
要在结构中使用嵌套结构,必须重新定义嵌套结构.
例如, 一个结构包含 2 POINT ("long;long"), 必须定义为 "long;long;long;long".
前两个 long 值对应的第一个 POINT; 后两个 long 值对应的第二个 POINT.
了解更多的 Windows API 类型, 请参考 MSDN.

返 回 值

成功: @error = 0.
失败: 设置 @error
@error: 1 不能使用这个 DLL 文件,
2 未知的 "返回类型",
3 在 DLL 文件中未找到这个"函数",
4 参数数量错误.
5 参数无效.
见备注.

备 注

如果指定 dll 文件名, DLL 将会被自动加载, 并在调用结束后关闭.
如果要手动控制 DLL 的加载和卸载, 则应使用 DllOpen 与 DllClose 函数, 并使用句柄代替文件名.

默认 AutoIt 使用 'stdcall' 的调用约定. 要使用 'cdecl' 调用方式, 在返回值类型后面加上 ':cdecl'. 例如:
DllCall("SQLite.dll", "int:cdecl", "sqlite3_open", "str", $sDatabase_Filename , "long*", 0).

默认 AutoIt 使用 ANSI 的函数名, 例如 MessageBoxA 使用 MessageBox 给出的函数名.
要调用 unicode 版本, 使用 MessageBoxW.

如果函数调用失败, 将设置 @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(0, "", $result[0]) ; 返回的字符数
MsgBox(0, "", $result[2]) ; 参数 2 返回的文本


; *******************************************************
; 示例 3 - 显示 PickIconDlg(显示选择包含图标资源文件的对话框) 窗口
; *******************************************************

Local $sFileName = @SystemDir & '\shell32.dll'

; 创建数据结构存储图标索引
Local $stIcon = DllStructCreate("int")
Local $stString = DllStructCreate("wchar[260]")
Local $structsize = DllStructGetSize($stString) / 2
DllStructSetData($stString, 1, $sFileName)

; 运行 PickIconDlg - '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(0, "信息", "选择的文件: " & $sFileName & @LF & "图标索引: " & $nIconIndex)

provider with jb51.net (unicode)