我在本机C ++中编写了一个Windows应用程序插件(作为DLL)。我们称之为myplugin.dll
。我的插件引用了另一个我们称之为other.dll
的DLL。
我的插件安装在应用程序myplugin
目录的plugins
子目录中:
application.exe
plugins\
myplugin\
myplugin.dll
myplugin.dll
隐式链接到other.dll
。我无法延迟加载other.dll
,因为它使用虚方法公开类,并且虚拟方法表被视为数据,它们无法从延迟加载的DLL导入。
我自然希望将other.dll
放在plugins\myplugin
目录中,myplugin.dll
旁边,但默认情况下,在搜索{{1}时,Windows不会查看plugins\myplugin
(source)。
除了将other.dll
放在应用程序的根目录中之外,我有什么选择?
(虽然问题Altering DLL search path for static linked DLL是相关的,但它描述了一个不太有意义的场景:一个隐式链接插件DLL的应用程序。我相信一个清晰,典型的场景可能会有所帮助发现此常见问题的其他解决方案,例如在应用程序加载other.dll
时显式加载other.dll
,如果可能的话。)
编辑:另一个类似的问题:Plugin DLLs that depend on other DLLs
编辑:我找到了问题的解决方案,请参阅下面接受的答案。据我所知,这是最干净的解决方案。我希望它可以帮助别人。
答案 0 :(得分:3)
我在上一次对我的问题的评论中概述的想法证明是一个好主意。
我将myplugin.dll
更改为简单的shim DLL。该垫片的入口点执行以下操作:
other.dll
(使用LoadLibrary
),在我的情况下为plugins\myplugin\
。myplugin-impl.dll
,即“真正的”插件。 myplugin.dll
然后只需将所有调用转发给执行该实际工作的myplugin-impl.dll
。
请注意,myplugin-impl.dll
仍隐式链接到other.dll
。但是,加载myplugin-impl.dll
时,应用程序进程的地址空间中的填充程序已加载other.dll
,因此不会再进行加载。
使用此解决方案,我们可以获得隐式DLL加载的好处(特别是使用虚方法加载C ++类),同时仍然可以完全控制加载隐式加载DLL的位置以及加载方式。