插件 DLL 引用的 DLL 的搜索路径

Search path for a DLL referenced by a plug-in DLL

本文关键字:DLL 搜索 路径 引用 插件      更新时间:2023-10-16

我正在用本机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。该填充码的入口点执行以下操作:

  1. 它首先从包含垫片的目录中加载other.dll(使用 LoadLibrary),pluginsmyplugin在我的情况下。
  2. 然后,它从同一目录中加载myplugin-impl.dll,即"真正的"插件。

然后myplugin.dll简单地将所有呼叫转发到执行实际工作的myplugin-impl.dll

请注意,myplugin-impl.dll仍然隐式链接到 other.dll 。但是,加载myplugin-impl.dll时,other.dll 已由填充程序加载到应用程序进程的地址空间中,因此不会发生进一步加载。

使用此解决方案,我们获得了隐式 DLL 加载的好处(特别是使用虚拟方法加载C++类),同时仍然可以完全控制隐式加载的 DLL 从何处加载以及如何加载。