2016-04-23 68 views
1

我正在用本地C++编写Windows应用程序插件(作为DLL)。我们称之为myplugin.dll。我的插件引用另一个DLL,我们将其称为other.dll由插件DLL引用的DLL的搜索路径

我的插件是安装在myplugin子目录中的应用程序的plugins目录:

application.exe 
plugins\ 
    myplugin\ 
     myplugin.dll 

myplugin.dll链接隐式other.dll。我不能延迟加载other.dll,因为它公开虚拟方法的类,并且虚拟方法表被视为数据,它们不能从延迟加载的DLL中导入。

我自然会喜欢的地方other.dllplugins\myplugin目录,旁边myplugin.dll,但默认情况下为other.dllsource)搜索时,Windows会不会看在plugins\myplugin

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

(虽然Altering DLL search path for static linked DLL这个问题是相关的,但它描述了一个不太合理的场景:应用程序隐式链接到插件DLL。我相信一个清晰的典型场景可能有助于揭示其他解决方案常见的问题,如明确加载other.dllmyplugin.dll被应用程序加载,如果这将是可能的)

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

编辑:我发现了一个解决问题的方法,请参阅下面接受的答案。据我所知,这是最干净的解决方案。我希望它能帮助别人。

+0

如何在PATH上的目录中找到?您发布的链接完全是这样说的。 – PaulMcKenzie

+2

可能重复的[改变静态链接DLL的DLL搜索路径](http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – gdlmx

+1

@PaulMcKenzie感谢您致力于改变PATH是非常具有侵入性的,可能有副作用,并且基本上需要安装程序(即不再可能实现纯粹的“xcopy-deployment”)。 –

回答

1

我在对我的问题的最后一条评论中列出的想法证明是一个好主意。

我将myplugin.dll更改为简单的shim DLL。 (使用LoadLibrary)从包含在我的情况垫片,plugins\myplugin\目录

  1. 它首先加载other.dll:该垫片的入口点执行以下操作。
  2. 然后它从同一目录加载myplugin-impl.dll,即“真实”插件。

myplugin.dll然后简单地转发所有电话到myplugin-impl.dll哪个做实际的工作。

请注意,myplugin-impl.dll仍隐含链接到other.dll。但是,当加载myplugin-impl.dll时,other.dll已由应用程序进程的地址空间中的填充程序加载,因此不会发生进一步的加载。使用此解决方案,我们可以获得隐式DLL加载(特别是使用虚拟方法加载C++类)的好处,同时仍然可以完全控制加载隐式加载的DLL的位置以及如何加载它。