使用C ++应用程序加载dll

时间:2019-02-25 04:07:06

标签: c++ visual-studio dll

我的插件使用Visual Studio以c ++编写。 我们的产品中有几个插件。我们的插件exe使用的一个版本的spotabcXXXX.dll位于存在我们exe的bin文件夹中,另一个插件也使用的另一个版本的spotabcXXXX.dll位于不同的位置。

独立运行插件时,它使用的是spotabcXXXX.dll,位于我们的bin中。但是,当我们运行整个产品时,我们的插件不是从bin中引用spotabcXXXX.dll,而是从其他位置引用。 我们的产品架构:

C:\Spot
-->CommonFiles
   ----->spotabcXXXX.dll
-->OurPlugin
   ----->spotabcXXXX.dll

由于CommonFiles首先出现(不知道任何原因),因此我们的插件从CommonFiles中获取spotabcXXXX.dll。 我们没有以编程方式使用LoadLibrary。

请帮助我如何从我们的垃圾箱中加载dll。

2 个答案:

答案 0 :(得分:0)

您需要检查DLL搜索顺序及其与您的“整个产品”及其位置的关系;请参阅:https://docs.microsoft.com/en-us/windows/desktop/dlls/dynamic-link-library-search-order

答案 1 :(得分:0)

Side-by-Side AssembliesActivation Contexts可以用来解决这种情况。

如果您的插件静态加载spotabcXXXX.dll,则可以为其定义一个SxS清单,该清单指定要依赖的特定spotabcXXXX.dll版本。加载插件后,操作系统加载器将加载并绑定清单指定的依赖DLL。

如果您的插件动态加载spotabcXXXX.dll,则可以创建依赖于所需spotabcXXXX.dll特定版本的激活上下文,然后可以在调用LoadLibrary()之前激活上下文。

无论哪种方式,即使调用过程的其他部分希望使用其他版本的spotabcXXXX.dll,您的插件也将绑定到该版本的spotabcXXXX.dll