#DllLoad

在脚本开始执行之前加载 DLL 或 EXE 文件.

#DllLoad FileOrDirName

参数

FileOrDirName

类型: 字符串

文件或目录的路径, 如下所述. 不得 包含双引号(除了参数周围的一对可选双引号), 通配符或除分号(`;) 外的转义序列.

内置变量可以用百分号括起来(例如, #DllLoad "%A_ScriptDir%"). 不属于有效变量引用的百分号按原义解释. 除了 A_Args 和内置类外, 所有内置变量都是有效的.

已知限制: 当编译脚本时, 变量由编译器计算, 结果可能与脚本最终执行时的返回值不同. 支持以下变量: A_AhkPath, A_AppData, A_AppDataCommon, A_ComputerName, A_ComSpec, A_Desktop, A_DesktopCommon, A_IsCompiled, A_LineFile, A_MyDocuments, A_ProgramFiles, A_Programs, A_ProgramsCommon, A_ScriptDir, A_ScriptFullPath, A_ScriptName, A_Space, A_StartMenu, A_StartMenuCommon, A_Startup, A_StartupCommon, A_Tab, A_Temp, A_UserName, A_WinDir.

文件: 要加载的 DLL 或 EXE 文件的绝对或相对路径. 如果指定了一个相对路径, 指令将使用与系统函数 LoadLibraryW 相同的搜索策略来搜索文件. 注意: SetWorkingDir 对 #DllLoad 没有影响, 因为 #DllLoad 是在脚本开始执行之前处理的.

目录: 指定目录而不是文件, 以改变随后出现的 #DllLoad 的搜索策略, 其不再需要指定 DLL 或 EXE 的绝对路径. 新的搜索策略与将 Directory 传递给系统函数 SetDllDirectoryW 相同. 如果省略此参数, 则恢复默认的搜索策略.

注意: 这个参数不是一个表达式, 但可以用引号括起来(可以是 '单引号' 或 "双引号").

备注

一旦 DLL 或 EXE 已由该指令加载, 它不能通过调用系统的函数 FreeLibrary 卸载. 当脚本终止时, 所有加载的文件都会自动卸载.

文件路径前面可以有选择地使用 *i 和一个空格, 这将导致程序忽略加载文件的任何失败. 只有当脚本在失败的情况下仍然能够执行时, 才应该使用这个选项, 例如, 如果 DLL 或 EXE 是非必要的, 或者如果脚本被设计为检测失败, 例如:

#DllLoad "*i MyDLL"
if !DllCall("GetModuleHandle", "str", "MyDLL")
    MsgBox "Failed to load MyDLL!"

如果 FileOrDirName 参数指定了一个没有路径的 DLL 名称, 并且文件名扩展名被省略, 则 .dll 将追加到文件名. 为了防止这种情况, 请在文件名后加上句点(.).

和其他指令一样, #DllLoad 不能有条件地执行.

DllCall

示例

在脚本开始执行之前, 加载位于当前用户 "我的文档" 文件夹中的 DLL 文件.

#DllLoad "%A_MyDocuments%\MyDLL.dll"