微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 更改静态链接DLL的DLL搜索路径

我已经搜索了任何提示,我可以做到这一点,但我发现是如何将SxS DLL重定向到本地应用程序文件夹.
这是我想要完成的:
(C)Application.exe链接到DLL,Plugin.DLL(依赖项目).这个DLL没有放在应用程序目录中,而是放在一个名为“plugins”的子文件夹中.由于DLL是静态链接的,应用程序将尝试从应用程序文件夹中加载它.

有什么办法可以改变这个特定的DLL的搜索路径?通过清单或VS2008链接器配置?

解决方法

我的第一个想法是,如果你是静态链接一个DLL,它不是一个插件.只需将DLL放在EXE文件夹中即可完成.这就是由静态加载的DLL支持的部署配置.

也就是说,有办法实现你想要的.但是他们大多是愚蠢的,或者是复杂的,没有什么好的理由:你的选择是:

>不要静态链接.使用LoadLibrary(“plugins / Plugin.dll”)& GetProcAddress访问插件内容.
>将“插件文件夹的路径”添加到系统PATH环境变量中.
>使用延迟加载机制延迟访问插件功能,设置可以使用提供的路径加载dll的custom helper function.
>将plugins文件夹转到程序集中(通过创建一个列出plugin.dll的.manifest文件).将“插件”作为依赖程序集添加到您的应用程序.现在它将在plugins文件夹中查找.
>将应用程序拆分成stub exe和动态加载的部分.在stub exe中调用SetDllDirectory指向plugin文件夹,然后调用LoadLibrary将完整路径传递给“appstub.dll”.

要将一个或多个dll的文件夹转换为“程序集”,只需将文件添加文件夹name.manifest的文件夹中即可.

所以,plugins.manifest: –

<assembly manifestVersion="1.0">
  <assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
  <file name="Plugin.dll"/>
</assembly>

这是一个非常好的主意,以确保文件夹和dll的名称是不同的,如果dll名称是程序集名称Windows将开始查看其嵌入式清单文件获取有关程序集的信息.

假设您使用的是Visual Studio 7或更高版本,那么将在项目中添加到.c / .cpp或.h文件中的以下指令将使您的应用程序尝试从程序集加载dll而不仅仅是本地目录:

#pragma comment(linker,"/manifestdependency:\"name='Plugins' "\
                        "processorArchitecture='*' version='1.0.0.0' "\
                        "type='win32'\"")

原文地址:https://www.jb51.cc/c/116654.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐