<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script> </head> <body> <h1>#DllLoad</h1> <p>在脚本开始执行之前<a href="DllCall.htm#load">加载</a> DLL 或 EXE 文件.</p> <pre class="Syntax"><span class="func">#DllLoad</span> <span class="optional">FileOrDirName</span></pre> <dl> <h2 id="Parameters">参数</h2> <dt>FileOrDirName</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>文件或目录的路径, 如下所述. <strong>不得</strong> 包含双引号, 通配符或除分号(<strong>`;</strong>) 外的<a href="../misc/EscapeChar.htm">转义序列</a>.</p> <p>内置变量可以用百分号括起来(例如, <code>#DllLoad %A_ScriptDir%</code>). 不属于有效变量引用的百分号按原义解释. 除了 <a href="../Variables.htm#Args">A_Args</a> 和内置类外, 所有内置变量都是有效的.</p> <p>已知限制: 当编译一个脚本时, 变量由编译器计算, 可能不同于脚本最终执行时返回的值. 支持以下变量: 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.</p> <p><strong>文件:</strong> 要加载的 DLL 或 EXE 文件的绝对或相对路径. 如果指定了一个相对路径, 指令将使用与系统函数 <a href="https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryw">LoadLibraryW</a> 相同的搜索策略来搜索文件. 注意: <a href="SetWorkingDir.htm">SetWorkingDir</a> 对 #DllLoad 没有影响, 因为 #DllLoad 是在脚本开始执行之前处理的.</p> <p><strong>目录:</strong> 指定目录而不是文件, 以改变随后出现的 #DllLoad 的搜索策略, 其不再需要指定 DLL 或 EXE 的绝对路径. 新的搜索策略与将 <em>Directory</em> 传递给系统函数 <a href="https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw">SetDllDirectoryW</a> 相同. 如果省略此参数, 则恢复默认的搜索策略.</p> <p class="note"><strong>注意:</strong> 这个参数不是一个表达式, 但可以用引号括起来(可以是 '单引号' 或 "双引号").</p> </dd> </dl> <h2 id="Remarks">备注</h2> <p>一旦 DLL 或 EXE 已由该指令加载, 它不能通过调用系统的函数 <a href="https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary">FreeLibrary</a> 卸载. 当脚本终止时, 所有加载的文件都会自动卸载.</p> <p><em>FileName</em> 参数可以有选择地在前面加上 <code>*i</code> 和一个空格, 这将导致程序忽略加载文件的任何失败. 只有当脚本在失败的情况下仍然能够执行时, 才应该使用这个选项, 例如, 如果 DLL 或 EXE 是非必要的, 或者如果脚本被设计为检测失败, 例如:</p> <pre>#DllLoad "*i MyDLL" if !DllCall("GetModuleHandle", "str", "MyDLL") MsgBox "Failed to load MyDLL!"</pre> <p>如果 <em>FileName</em> 参数指定了一个没有路径的 DLL 名称, 并且文件名扩展名被省略, 则 <em>.dll</em> 将追加到文件名. 为了防止这种情况, 在文件名中包含一个尾随点字符(.).</p> <p>和其他指令一样, #DllLoad 不能有条件地执行.</p> <h2 id="Related">相关</h2> <p><a href="DllCall.htm">DllCall</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExBasic"> <p><a class="ex_number" href="#ExBasic"></a> 在脚本开始执行之前, 加载位于当前用户 "我的文档" 文件夹中的 DLL 文件.</p> <pre>#DllLoad "%A_MyDocuments%\MyDLL.dll"</pre> </div> </body> </html>