更改静态链接 DLL 的 DLL 搜索路径
困境:
静态链接时DLL 到应用程序,它通常在应用程序的目录中搜索 DLL。但是,在某些情况下,DLL 可能不位于同一目录中。例如,它可以驻留在指定为“插件”的子文件夹中。
可能的解决方案:
1。动态链接:
考虑使用 LoadLibrary() 和 GetProcAddress() 而不是静态链接来访问插件的功能。这为从指定位置加载 DLL 提供了更大的灵活性。
2.环境变量修改:
将插件文件夹路径追加到系统的PATH环境变量中,保证DLL能够成功定位并加载。
3.延迟加载机制:
采用延迟加载机制来延迟加载插件功能。实现一个自定义帮助函数,利用提供的路径加载 DLL。
4.程序集创建:
通过在其中生成 .manifest 文件将插件文件夹转换为程序集。将“plugins”文件夹指定为应用程序内的依赖程序集。这将引导 DLL 在插件文件夹中搜索。
5.存根应用程序和动态加载:
将应用程序细分为存根可执行文件和动态加载的组件。在存根可执行文件中,使用 SetDllDirectory 来指示插件文件夹。随后,调用 LoadLibrary,传递“appstub.dll”文件的完整路径。
其他提示:
将文件夹转换为程序集:
要将包含 DLL 的目录转换为程序集,请将名为“[folder_name].manifest”的文件添加到包含以下内容的文件夹中:
<assembly manifestVersion="1.0"> <assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" /> <file name="Plugin.dll"/> </assembly>
Pragma Directive对于 DLL 加载:
在 Visual Studio 7 或更高版本中,使用以下 pragma 指令指示应用程序从程序集而不是本地目录检索 DLL:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' \ processorArchitecture='*' version='1.0.0.0' \ type='win32'\"")
以上是当 DLL 不在应用程序目录中时,如何更改静态链接 DLL 的 DLL 搜索路径?的详细内容。更多信息请关注PHP中文网其他相关文章!