函数参考


DllCallAddress

动态调用一个指定内存地址的函数.

警告: 这是一个高级函数. 不正确的使用将导致 AutoIt 崩溃. 开始使用这个函数前,您需要先确定 DllCall() 还无法达到你的要求.

DllCallAddress ( "返回值类型", 地址 [, 类型1, 参数1 [, 类型 n, 参数 n]] )

参数

返回值类型 函数的返回值类型(请查看下面的 注意 部分).
地址 函数所在内存地址. 如果这个值不正确将导致你的脚本崩溃!
类型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