# #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 卸载. 当脚本终止时, 所有加载的文件都会自动卸载.

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

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

如果 FileName 参数指定了一个没有路径的 DLL 名称, 并且文件名扩展名被省略, 则 .dll 将追加到文件名. 为了防止这种情况, 在文件名中包含一个尾随点字符(.).

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

## 相关

DllCall

## 示例

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

    #DllLoad "%A_MyDocuments%\MyDLL.dll"

dftg