学 AHK_H 时,经常会看到几个相似名字:AutoHotkey.dll、ahkdllahktextdllahkExec。它们不是同一个东西,但都围绕一个核心:把 AutoHotkey 解释器做成 DLL,让别的线程或宿主程序调用。

如果你只写普通 H 版脚本,新手优先用 AhkThread()。如果你想理解底层,或者需要自己 DllCall,就要分清这些导出函数。相关文档可看 ahkdllahktextdllahkExec()

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:从字符串启动脚本

ahktextdllahkdll 的区别是:它不要求脚本先保存为文件,而是直接接收一段脚本文本。临时线程、动态生成脚本、测试片段时更方便。

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。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。