基 礎(chǔ) 函 數(shù) 參 考
DllCall
調(diào)用 DLL 文件中的函數(shù).
參 數(shù)
文件 |
DLL 文件名. 例如 "user32.dll". 也可使用由 DllOpen 返回的句柄
(見備注). |
返回類型 |
函數(shù)的返回類型 (見下文). |
函數(shù) |
DLL 文件內(nèi)的函數(shù)名稱, 例如 "MessageBox" 或序號值, 例如 62. |
類型1 |
[可選參數(shù)] 第一個類型參數(shù) (見備注). |
參數(shù)1 |
[可選參數(shù)] 第一個實際參數(shù) (見備注). |
類型n |
[可選參數(shù)] 第 n 個類型參數(shù) (見備注). |
參數(shù)n |
[可選參數(shù)] 第 n 個實際參數(shù) (見備注). |
類型值:
類型
|
描述
|
none |
沒有值 (用于只有一個有效返回的類型 - 相當于 C 語言的 void) |
BYTE |
無符號 8 位整數(shù) |
BOOLEAN |
無符號 8 位整數(shù) |
short |
16 位整數(shù) |
USHORT |
無符號 16 位整數(shù) |
WORD |
無符號 16 位整數(shù) |
int |
32 位整數(shù) |
long |
32 位整數(shù) |
BOOL |
32 位整數(shù) |
UINT |
無符號 32 位整數(shù) |
ULONG |
無符號 32 位整數(shù) |
DWORD |
無符號 32 位整數(shù) |
INT64 |
64 位整數(shù) |
UINT64 |
無符號 64 位整數(shù) |
ptr |
常規(guī)指針 (void *) |
HWND |
窗口句柄 (指針) |
HANDLE |
句柄(指針) |
float |
單精度浮點數(shù) |
double |
雙精度浮點數(shù) |
INT_PTR, LONG_PTR, LRESULT, LPARAM |
大型整數(shù)指針, 在 x86 或 x64 的 AutoIt 版本中運行. |
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM |
大型無符號整數(shù)指針, 在 x86 或 x64 的 AutoIt 版本中運行. |
str |
ANSI 字符串 (不超過 65536 個字符). |
wstr |
UNICODE 寬字符串 (不超過 65536 個字符). |
struct |
用于 DllStructCreate() 創(chuàng)建結(jié)構(gòu) |
* |
添加一個 * 到另一個類型末尾. 例如 "int*" 傳遞一個指針到 "int" 類型. |
Windows API 類型轉(zhuǎn)換為 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 |
要在結(jié)構(gòu)中使用嵌套結(jié)構(gòu),必須重新定義嵌套結(jié)構(gòu).
例如, 一個結(jié)構(gòu)包含 2 POINT ("long;long"), 必須定義為 "long;long;long;long".
前兩個 long 值對應(yīng)的第一個 POINT; 后兩個 long 值對應(yīng)的第二個 POINT.
了解更多的 Windows API 類型, 請參考 MSDN.
返 回 值
成功: |
@error = 0. |
失敗: |
設(shè)置 @error |
@error: |
1 不能使用這個 DLL 文件, |
|
2 未知的 "返回類型", |
|
3 在 DLL 文件中未找到這個"函數(shù)", |
|
4 參數(shù)數(shù)量錯誤. |
|
5 參數(shù)無效. |
見備注.
備 注
如果指定 dll 文件名, DLL 將會被自動加載, 并在調(diào)用結(jié)束后關(guān)閉.
如果要手動控制 DLL 的加載和卸載, 則應(yīng)使用 DllOpen 與 DllClose 函數(shù), 并使用句柄代替文件名.
默認 AutoIt 使用 'stdcall' 的調(diào)用約定. 要使用 'cdecl' 調(diào)用方式, 在返回值類型后面加上
':cdecl'. 例如:
DllCall("SQLite.dll", "int:cdecl", "sqlite3_open", "str",
$sDatabase_Filename , "long*", 0).
默認 AutoIt 使用 ANSI 的函數(shù)名, 例如 MessageBoxA 使用 MessageBox 給出的函數(shù)名.
要調(diào)用 unicode 版本, 使用 MessageBoxW.
如果函數(shù)調(diào)用失敗, 將設(shè)置 @error 為 1.
否則返回包含函數(shù)返回值和所有參數(shù)副本的數(shù)組 (包括可能被傳遞參數(shù)修改的函數(shù)參數(shù)).
$return[0] = 函數(shù)返回值
$return[1] = 參數(shù)1
$return[2] = 參數(shù)2
...
$return[n] = 參數(shù)n
相 關(guān) 函 數(shù)
DllCallbackFree, DllCallbackGetPtr, DllCallbackRegister, DllOpen, DllClose,
DllStructCreate, DllStructGetPtr
函 數(shù) 示 例
;
*******************************************************
; 示例 1 - 直接調(diào)用 MessageBox API
;
*******************************************************
Local $result
= DllCall("user32.dll", "int", "MessageBox", "hwnd", 0, "str", "若干標題", "str", "若干標題", "int", 0)
;
*******************************************************
; 示例 2 - 修改調(diào)用函數(shù)的參數(shù)
;
*******************************************************
Local $hwnd
= WinGetHandle("[CLASS:Notepad]")
$result =
DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hwnd, "str", "",
"int", 32768)
MsgBox(0, "", $result[0]) ;
返回的字符數(shù)
MsgBox(0, "", $result[2]) ; 參數(shù) 2
返回的文本
;
*******************************************************
; 示例 3 - 顯示 PickIconDlg(顯示選擇包含圖標資源文件的對話框)
窗口
;
*******************************************************
Local $sFileName
= @SystemDir
& '\shell32.dll'
; 創(chuàng)建數(shù)據(jù)結(jié)構(gòu)存儲圖標索引
Local $stIcon
= DllStructCreate("int")
Local $stString
= DllStructCreate("wchar[260]")
Local $structsize
= DllStructGetSize($stString) / 2
DllStructSetData($stString, 1,
$sFileName)
; 運行 PickIconDlg - '62' 是這個函數(shù)的序號值
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)