基 础 函 数 参 考


DllCallAddress

动态调用特定内存地址的函数.

警告: 这是一个高级函数. 这个函数的不正确使用可能造成 AutoIt 崩溃. 使用此函数之前必须确保 DllCall() 不能做到你所需要的.

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

参 数

返回类型 函数的返回类型 (见下文).
地址 函数的地址. 如果这个值无效, 脚本将崩溃!
类型 1 [可选参数l] 参数的类型 (见备注).
参数 n [可选参数l] 实际参数 (见备注).
类型 n [可选参数l] 第 n 个参数的类型 (见备注).
参数 n [可选参数l] 第 n 个实际参数 (见备注).

有效的类型:
类 型 描 述
none 没有值 (仅适用于有效的返回类型 - 相当于 C 无效)
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 或 x6 4版本的 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 点结构 ("long;long") 将被宣布为 "long;long;long;long".
前两个长值对应第一点结构, 后两个值对应第二点结构.
其它 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()
    ; 启用 GUI 事件模式.
    Opt("GUIOnEventMode", 1)

    ; 创建一个简单的 GUI.
    Local $hWnd = GUICreate("DllCallAddress 示例")

    ; 注册关闭事件处理程序.
    GUISetOnEvent($GUI_EVENT_CLOSE, "OnClose")

    ; 显示 GUI.
    GUISetState(@SW_SHOWNORMAL, $hWnd)

    ; 获取窗口程序指针.
    Local $pWndProc = _WinAPI_GetWindowLong($hWnd, $GWL_WNDPROC)


    ; 提示用户即将发生什么.
    MsgBox(4096, "DllCallAddress 示例消息", "当您按下[ 确定 ], 测试窗口将关闭.")

    ; 生成一个 WM_CLOSE 事件,并把它传递到 WindowProc().
    ; 这不应该做成一个真正的应用程序(使用 _SendMessage() 代替)
    ; 它只是演示如何使用 DllCallAddress 函数.
    DllCallAddress("LRESULT", $pWndProc, "HWND", $hWnd, "UINT", $WM_CLOSE, "WPARAM", 0, "LPARAM", 0)
EndFunc   ;==>Example

Func OnClose()
    GUIDelete(@GUI_WinHandle)
    MsgBox(4096, "DllCallAddress 示例消息", "收到关闭事件, 现在测试窗口应该已经关闭了.")
EndFunc   ;==>OnClose

provider with jb51.net (unicode)