学 AHK_H 时,经常会看到几个相似名字:AutoHotkey.dll、ahkdll、ahktextdll、ahkExec。它们不是同一个东西,但都围绕一个核心:把 AutoHotkey 解释器做成 DLL,让别的线程或宿主程序调用。
如果你只写普通 H 版脚本,新手优先用 AhkThread()。如果你想理解底层,或者需要自己 DllCall,就要分清这些导出函数。相关文档可看 ahkdll、ahktextdll、ahkExec()。
AutoHotkey.dll 是什么
可以把 AutoHotkey.dll 理解成“DLL 形态的 AHK 解释器”。普通 AutoHotkey.exe 是启动一个脚本进程,AutoHotkey.dll 则允许当前进程加载 AHK 解释器,并通过导出函数启动脚本线程、执行代码、查找函数等。
#Requires AutoHotkey v1.1
#NoEnv
SetBatchLines, -1
dllPath := A_AhkDir "\AutoHotkey.dll"
hModule := DllCall("LoadLibrary", "Str", dllPath, "Ptr")
if (!hModule) {
MsgBox, 无法加载 AutoHotkey.dll
ExitApp
}
MsgBox, AutoHotkey.dll 已加载
ahkdll:从文件启动脚本
ahkdll 的定位很直接:从磁盘或网络路径加载一个 .ahk 文件,在 AutoHotkey.dll 里启动新线程。它适合脚本已经落地成文件的情况。
dllPath := A_AhkDir "\AutoHotkey.dll"
scriptFile := A_ScriptDir "\Worker.ahk"
FileDelete, %scriptFile%
FileAppend, #Persistent`nMsgBox`, 来自 Worker.ahk, %scriptFile%, UTF-8
hThread := DllCall(dllPath "\ahkdll"
, "Str", scriptFile
, "Str", "param1"
, "Str", "FileThread"
, "CDecl Ptr")
ahktextdll:从字符串启动脚本
ahktextdll 和 ahkdll 的区别是:它不要求脚本先保存为文件,而是直接接收一段脚本文本。临时线程、动态生成脚本、测试片段时更方便。
dllPath := A_AhkDir "\AutoHotkey.dll"
scriptText =
(
#Persistent
MsgBox, 来自 ahktextdll 字符串脚本
)
hThread := DllCall(dllPath "\ahktextdll"
, "Str", scriptText
, "Str", ""
, "Str", "TextThread"
, "CDecl Ptr")
ahkExec:在当前脚本里临时执行代码
ahkExec() 不是启动一个新脚本文件,也不是创建完整的新线程入口。它的作用是在当前已经运行的脚本环境里临时执行一段字符串代码。H 版对象写法里,也可以对 AhkThread() 创建出来的线程对象调用 ahkExec。
; 当前线程执行
ahkExec("MsgBox, 当前线程临时执行")
; 新线程对象里执行
dll := AhkThread()
dll.ahkExec["MsgBox, 子线程里临时执行"]
四者怎么选
- 普通 H 版脚本:优先用
AhkThread(),代码更短,资源释放也更直观。 - 脚本已有文件:用
ahkdll。 - 脚本是字符串:用
ahktextdll。 - 已经有运行中的脚本环境,只想临时执行几行:用
ahkExec()。 - 需要理解底层或做封装:再研究
DllCall方式。
注意事项
- 动态执行代码不要拼接不可信输入,否则调试和安全边界都会变差。
- 多个 DLL 线程之间变量默认不互通,不要把它当成普通函数 Include。
- 线程长期存在时要设计退出和释放逻辑。
- 位数要一致:32 位进程加载 32 位 DLL,64 位进程加载 64 位 DLL。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)