插件DLL

时间:2016-04-23 18:35:04

标签: c++ windows dll linker

我在本机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\mypluginsource)。

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

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

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

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

1 个答案:

答案 0 :(得分:3)

我在上一次对我的问题的评论中概述的想法证明是一个好主意。

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

  1. 首先从包含垫片的目录中加载other.dll(使用LoadLibrary),在我的情况下为plugins\myplugin\
  2. 然后从同一目录加载myplugin-impl.dll,即“真正的”插件。
  3. myplugin.dll然后只需将所有调用转发给执行该实际工作的myplugin-impl.dll

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

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