【发布时间】: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 准备运行时环境。