基 础 函 数 参 考
DllCall
调用 DLL 文件中的函数.
参 数
文件 |
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)