内置函数,类似于 DllCall,但适用于 DllCall 结构并使用对象语法。它通常比 DllCall 更快,更易于使用,并且节省了大量的打字和代码。
OutputVar := DynaCall("DllFile\Function", "ParameterDefinition", Default1, Default2, Default3, ...)
函数示例: TrueSleep := DynaCall("kernel32\Sleep", "ui", 100)
调用函数: TrueSleep[1000], %TrueSleep%(1000)
存储用于调用 dll 函数的 DynaCall 对象的变量的名称。
DLL 或 EXE 文件名,后跟反斜杠和函数名称。例如:“MyDLL\MyFunction”(“.dll”是默认值,可以省略)。如果没有指定绝对路径, DllFile 假定位于系统的 PATH 或 A_WorkingDir 中。
DllFile 当调用驻留在 User32.dll、Kernel32.dll、ComCtl32.dll 或 Gdi32.dll 中的函数时,可以省略。例如,“User32\IsWindowVisible”产生与“IsWindowVisible”相同的结果。
如果通过给定名称找不到函数,则会自动附加“W”(Unicode) 后缀。例如,“MessageBox”与“MessageBoxW”相同。
该参数也可以仅包含一个整数,它被解释为要调用的函数的地址。此类地址的来源包括 COM 和 Callback。
对于定义,您需要使用 DllCall 类型的简短版本。
| DllCall | DynaCall 等效类型 |
| Int | i |
| Str | s |
| AStr | a |
| WStr | w |
| Short | h |
| Char | c |
| Float | f |
| Double | d |
| PTR | t |
| Int64 | i6 |
| CDecl | 使用 == 而不是 =,例如“t==uis”。 |
| U 前缀以及 * 或 p | 这也受支持,例如:“ui=ui*s”、“ui=uips” |
参数定义的语法为 [返回类型 =[=]
]
参数类型 参数类型 参数类型
...
参数之间可以有任意数量的空格或制表符,这些将被忽略。
更改参数顺序
下面的示例对此进行了最好的解释。
AHKCMD:=DynaCall("SendMessage", ["t=tuitt", 3], A_ScriptHwnd, 0x111)
MsgBox % A_IsSuspended
AHKCMD[ 65305 ] ; 挂起脚本,以下是相同的调用:
; DllCall("SendMessage", "PTR", A_ScriptHwnd, "UInt", 0x111, "PTR", 65305, "PTR", 0)
MsgBox % A_IsSuspended
在函数调用中省略参数时使用的默认值。
请注意,这始终使用 ParameterDefinition 中指定的原始参数顺序。
Base 和 __Class 是属性,不能使用它们作为点 (.) 语法的参数来调用 DynaCall,而是使用 MyDynaCall["base"] 语法!
AHKCMD:=DynaCall("SendMessage", ["t=tuitt", 3], A_ScriptHwnd, 0x111) ; 定义一个 DynaCall 对象。
AHKCMD[ 65305 ] ; 调用实际函数
AHKCMD.65305
%AHKCMD%(65305)