函数参考
DllCallAddress
动态调用一个指定内存地址的函数.
警告: 这是一个高级函数. 不正确的使用将导致 AutoIt 崩溃. 开始使用这个函数前,您需要先确定
DllCall() 还无法达到你的要求.
参数
返回值类型 |
函数的返回值类型(请查看下面的 注意 部分). |
地址 |
函数所在内存地址. 如果这个值不正确将导致你的脚本崩溃! |
类型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: |
2 未知 "返回值类型", |
|
4 参数数量错误. |
|
5 无效参数. |
参考注意项目.
注意/说明
默认情况下, AutoIt 使用 'stdcall' 调用方式. 要使用 'cdecl' 方式调用,请在返回值类型后面加上 ':cdecl' .
如果函数调用失败,将会设置 @error 为非0.反之将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数).
$return[0] = 函数的返回值
$return[1] = 参数1
$return[2] = 参数2
...
$return[n] = 参数n
相关
DllCall, DllCallbackFree, DllCallbackGetPtr, DllCallbackRegister, DllOpen, DllClose, DllStructCreate, DllStructGetPtr
示例/演示
#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
Example()
Func Example()
; Enable GUI event mode.
Opt("GUIOnEventMode", 1)
; Create a simple GUI.
Local $hWnd = GUICreate("DllCallAddress Example")
; Register the close event handler.
GUISetOnEvent($GUI_EVENT_CLOSE, "OnClose")
; Show the GUI.
GUISetState(@SW_SHOWNORMAL, $hWnd)
; Get a pointer to the window's WindowProc().
Local $pWndProc = _WinAPI_GetWindowLong($hWnd, $GWL_WNDPROC)
; Tell the user what is about to happen.
MsgBox(4096, "DllCallAddress Example Msg", "When you press OK the test window will close.")
; Explicitly generate a WM_CLOSE event and pass it directly to the WindowProc().
; This should never be done in a real application (Use _SendMessage() instead) but
; it demonstrates how to use the function.
DllCallAddress("LRESULT", $pWndProc, "HWND", $hWnd, "UINT", $WM_CLOSE, "WPARAM", 0, "LPARAM", 0)
EndFunc ;==>Example
Func OnClose()
GUIDelete(@GUI_WinHandle)
MsgBox(4096, "DllCallAddress Example Msg", "Close event received, the test window should now be closed.")
EndFunc ;==>OnClose