首页 >后端开发 >C++ >当 DLL 不在应用程序目录中时,如何更改静态链接 DLL 的 DLL 搜索路径?

当 DLL 不在应用程序目录中时,如何更改静态链接 DLL 的 DLL 搜索路径?

Barbara Streisand
Barbara Streisand原创
2024-11-03 06:01:30670浏览

How to Alter the DLL Search Path for Statically Linked DLLs When the DLL is Not in the Application Directory?

更改静态链接 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn