基 础 函 数 参 考
DllCallAddress
动态调用特定内存地址的函数.
警告: 这是一个高级函数. 这个函数的不正确使用可能造成 AutoIt 崩溃.
使用此函数之前必须确保
DllCall() 不能做到你所需要的.
参 数
返回类型 |
函数的返回类型 (见下文). |
地址 |
函数的地址. 如果这个值无效, 脚本将崩溃! |
类型 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