插件 DLL 引用的 DLL 的搜索路径
Search path for a DLL referenced by a plug-in DLL
我正在用本机C++编写一个Windows应用程序插件(作为DLL)。我们称之为myplugin.dll
.我的插件引用了另一个 DLL,我们将它称为 other.dll
。
我的插件安装在应用程序plugins
目录的myplugin
子目录中:
application.exe
plugins
myplugin
myplugin.dll
myplugin.dll
链接到隐式链接到other.dll
。我无法延迟加载other.dll
因为它公开了具有虚拟方法的类,并且虚拟方法表被视为数据,因此无法从延迟加载的 DLL 导入它们。
我自然想将other.dll
放在pluginsmyplugin
目录中,靠近myplugin.dll
,但默认情况下,Windows 在搜索other.dll
(源)时不会在pluginsmyplugin
中查找。
除了将other.dll
放在应用程序的根目录中之外,我还有哪些选择?
(虽然问题更改静态链接 DLL 的 DLL 搜索路径是相关的,但它描述了一个不太有意义的方案:一个应用程序隐式链接到插件 DLL。我相信一个清晰、典型的场景可能有助于发现这个常见问题的其他解决方案,例如在应用程序加载myplugin.dll
时显式加载other.dll
如果可能的话。
编辑:另一个类似的问题:依赖于其他DLL的插件DLL
编辑:我找到了问题的解决方案,请参阅下面的接受答案。据我所知,这是最干净的解决方案。我希望它能帮助其他人。
我在问题的最后一条评论中概述的想法被证明是一个好主意。
我myplugin.dll
更改为一个简单的填充码 DLL。该填充码的入口点执行以下操作:
- 它首先从包含垫片的目录中加载
other.dll
(使用LoadLibrary
),pluginsmyplugin
在我的情况下。 - 然后,它从同一目录中加载
myplugin-impl.dll
,即"真正的"插件。
然后myplugin.dll
简单地将所有呼叫转发到执行实际工作的myplugin-impl.dll
。
请注意,myplugin-impl.dll
仍然隐式链接到 other.dll
。但是,加载myplugin-impl.dll
时,other.dll
已由填充程序加载到应用程序进程的地址空间中,因此不会发生进一步加载。
使用此解决方案,我们获得了隐式 DLL 加载的好处(特别是使用虚拟方法加载C++类),同时仍然可以完全控制隐式加载的 DLL 从何处加载以及如何加载。
- 挂起和取消挂起一个文件DLL
- 有根的二进制搜索树.保留与其父级的链接
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 在C++中搜索嵌套多映射值
- 如何从客户端为COM服务器设置dll搜索路径?
- 搜索.NET组件的搜索路径取决于C /CLI DLL
- JNI DLL如何搜索其依赖的本机DLL
- C++设置 DLL 搜索位置
- 插件 DLL 引用的 DLL 的搜索路径
- 可以在不设置链接器>常规>附加库目录的情况下搜索哪种 dll 或 lib
- 如何设置 dll 搜索路径
- 为什么我的应用程序在错误的DLL中搜索函数
- 如何更改应用程序使用的.dll搜索路径?
- 用java中的System.loadLibrary()加载的.dll的搜索路径
- 我如何使用find_package使可执行搜索.dll二进制文件
- 以编程方式自定义 DLL 搜索目录
- 在DLL搜索路径中添加路径以帮助执行依赖于DLL的EXE