基 礎(chǔ) 函 數(shù) 參 考
DllCallAddress
動(dòng)態(tài)調(diào)用特定內(nèi)存地址的函數(shù).
警告: 這是一個(gè)高級(jí)函數(shù). 這個(gè)函數(shù)的不正確使用可能造成 AutoIt 崩潰.
使用此函數(shù)之前必須確保
DllCall() 不能做到你所需要的.
參 數(shù)
返回類型 |
函數(shù)的返回類型 (見(jiàn)下文). |
地址 |
函數(shù)的地址. 如果這個(gè)值無(wú)效, 腳本將崩潰! |
類型 1 |
[可選參數(shù)l] 參數(shù)的類型 (見(jiàn)備注). |
參數(shù) n |
[可選參數(shù)l] 實(shí)際參數(shù) (見(jiàn)備注). |
類型 n |
[可選參數(shù)l] 第 n 個(gè)參數(shù)的類型 (見(jiàn)備注). |
參數(shù) n |
[可選參數(shù)l] 第 n 個(gè)實(shí)際參數(shù) (見(jiàn)備注). |
有效的類型:
類 型
|
描 述
|
none |
沒(méi)有值 (僅適用于有效的返回類型 - 相當(dāng)于 C 無(wú)效) |
BYTE |
無(wú)符號(hào) 8 位整數(shù) |
BOOLEAN |
無(wú)符號(hào) 8 位整數(shù) |
short |
16 位整數(shù) |
USHORT |
無(wú)符號(hào) 16 位整數(shù) |
WORD |
無(wú)符號(hào) 16 位整數(shù) |
int |
32 位整數(shù) |
long |
32 位整數(shù) |
BOOL |
32 位整數(shù) |
UINT |
32 位無(wú)符號(hào)整數(shù) |
ULONG |
32 位無(wú)符號(hào)整數(shù) |
DWORD |
32 位無(wú)符號(hào)整數(shù) |
INT64 |
64 位整數(shù) |
UINT64 |
無(wú)符號(hào) 64 位整數(shù) |
ptr |
一般指針 (void *) |
HWND |
窗口句柄 (指針) |
HANDLE |
句柄 (指針) |
float |
單精度浮點(diǎn)數(shù) |
double |
雙精度浮點(diǎn)數(shù) |
INT_PTR, LONG_PTR, LRESULT, LPARAM |
當(dāng)運(yùn)行在 x86 或 x64 版本的 AutoIt 時(shí), 一個(gè)大到足以容納一個(gè)指針的整數(shù). |
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM |
當(dāng)運(yùn)行在 x86 或 x6 4版本的 AutoIt 時(shí), 大到足以容納一個(gè)指針的無(wú)符號(hào)整數(shù). |
str |
ANSI 字符串 (至少分配 65536 個(gè)字符). |
wstr |
Unicode 寬字符字符串 (至少分配 65536 個(gè)字符). |
struct |
用于 DllStructCreate() 創(chuàng)建結(jié)構(gòu) |
* |
添加 * 到類型的末尾作為另一種類型傳遞的參考. 例如 "int*" 傳遞 "int" 類型的指針. |
轉(zhuǎn)換 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 |
要在結(jié)構(gòu)內(nèi)部使用嵌套結(jié)構(gòu), 你必須重新定義嵌套結(jié)構(gòu).
例如, 結(jié)構(gòu)中含有 2 點(diǎn)結(jié)構(gòu) ("long;long") 將被宣布為 "long;long;long;long".
前兩個(gè)長(zhǎng)值對(duì)應(yīng)第一點(diǎn)結(jié)構(gòu), 后兩個(gè)值對(duì)應(yīng)第二點(diǎn)結(jié)構(gòu).
其它 Windows API 類型見(jiàn) MSDN.
返 回 值
成功: |
返回 @error = 0. |
失敗: |
設(shè)置 @error |
@error: |
2 未知的"返回類型", |
|
4 壞的參數(shù)數(shù)目. |
|
5 參數(shù)無(wú)效 |
見(jiàn)備注.
備 注
默認(rèn) AutoIt 使用 'stdcall' 調(diào)用方法. 要使用 'cdecl' 在返回類型后調(diào)用方法 ':cdecl'.
如果函數(shù)調(diào)用失敗, 則 @error 設(shè)置為非 0.
否則返回包含函數(shù)返回值和所有參數(shù)副本的數(shù)組 (包括通過(guò)引用傳遞時(shí), 該函數(shù)可能修改的參數(shù)).
$return[0] = 函數(shù)的返回值
$return[1] = 參數(shù) 1
$return[2] = 參數(shù) 2
...
$return[n] = 參數(shù) n
相 關(guān) 函 數(shù)
DllCall, DllCallbackFree, DllCallbackGetPtr, DllCallbackRegister, DllOpen, DllClose,
DllStructCreate, DllStructGetPtr
函 數(shù) 示 例
#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
Example()
Func Example()
; 啟用 GUI
事件模式.
Opt("GUIOnEventMode", 1)
; 創(chuàng)建一個(gè)簡(jiǎn)單的
GUI.
Local
$hWnd =
GUICreate("DllCallAddress
示例")
;
注冊(cè)關(guān)閉事件處理程序.
GUISetOnEvent($GUI_EVENT_CLOSE, "OnClose")
; 顯示
GUI.
GUISetState(@SW_SHOWNORMAL, $hWnd)
;
獲取窗口程序指針.
Local
$pWndProc =
_WinAPI_GetWindowLong($hWnd,
$GWL_WNDPROC)
;
提示用戶即將發(fā)生什么.
MsgBox(4096, "DllCallAddress 示例消息",
"當(dāng)您按下[ 確定 ], 測(cè)試窗口將關(guān)閉.")
; 生成一個(gè)
WM_CLOSE 事件,并把它傳遞到 WindowProc().
;
這不應(yīng)該做成一個(gè)真正的應(yīng)用程序(使用 _SendMessage() 代替)
; 它只是演示如何使用
DllCallAddress 函數(shù).
DllCallAddress("LRESULT", $pWndProc, "HWND", $hWnd, "UINT", $WM_CLOSE, "WPARAM", 0, "LPARAM", 0)
EndFunc ;==>Example
Func OnClose()
GUIDelete(@GUI_WinHandle)
MsgBox(4096, "DllCallAddress 示例消息",
"收到關(guān)閉事件, 現(xiàn)在測(cè)試窗口應(yīng)該已經(jīng)關(guān)閉了.")
EndFunc ;==>OnClose