【问题标题】:Search path for a DLL referenced by a plug-in DLL插件 DLL 引用的 DLL 的搜索路径
【发布时间】:2016-04-23 18:35:03
【问题描述】:

我正在用原生 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 放在plugins\myplugin 目录中,在myplugin.dll 旁边,但默认情况下,Windows 在搜索plugins\myplugin 时不会查找plugins\myplugin (source)。

除了将other.dll 放在应用程序的根目录之外,我还有哪些选择?

(虽然问题 Altering DLL search path for static linked DLL 是相关的,但它描述了一个不太有意义的场景:应用程序隐式链接到插件 DLL。我相信一个清晰的典型场景可能有助于发现其他解决方案这个常见问题,例如在应用程序加载myplugin.dll 时显式加载other.dll,如果可能的话。)

编辑:另一个类似的问题:Plugin DLLs that depend on other DLLs

编辑:我找到了问题的解决方案,请参阅下面接受的答案。据我所知,这是最干净的解决方案。我希望它可以帮助别人。

【问题讨论】:

  • 在 PATH 上找到的目录中怎么样?您发布的链接正是如此。
  • @PaulMcKenzie 感谢您的参与。更改 PATH 非常具有侵入性,可能会产生副作用,并且基本上需要安装程序(即不再可能使用纯“xcopy-deployment”)。
  • 并引入潜在的权限提升,因为系统将加载它在路径上找到的第一个“other.dll”。
  • Altering DLL search path... 中的解决方案在这里适用,并且该场景用于简单地限制一些潜在的解决方案 - 在主机应用程序调用之前将加载静态链接的插件 dll @ 987654341@ - 这是一个次优解决方案,因为它需要应用程序为 dll 准备运行时环境。

标签: c++ windows dll linker


【解决方案1】:

我在对我的问题的最后评论中概述的想法结果证明是一个很好的想法。

我将myplugin.dll 更改为一个简单的shim DLL。该 shim 的入口点执行以下操作:

  1. 它首先从包含垫片的目录中加载other.dll(使用LoadLibrary),在我的例子中是plugins\myplugin\
  2. 然后它会从同一目录加载“真正的”插件myplugin-impl.dll

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

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

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

【讨论】:

  • 您的 shim 如何知道它是从哪个目录加载的?
猜你喜欢
  • 1970-01-01
  • 2011-04-19
  • 2011-01-20
  • 2011-04-09
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多