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

问题描述 投票:0回答:2

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

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

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

由于CommonFiles是第一个(不知道是什么原因),我们的插件从CommonFiles获取spotabcXXXX.dll。我们没有以编程方式使用LoadLibrary。

请帮我如何从我们的垃圾箱加载DLL。

c++ visual-studio dll
2个回答
0
投票

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


0
投票

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

如果你的插件静态加载spotabcXXXX.dll,你可以为它定义一个SxS清单,它指定你想要的特定版本的spotabcXXXX.dll的依赖性。加载插件时,OS加载程序将加载并绑定清单指定的依赖DLL。

如果您的插件动态加载spotabcXXXX.dll,您可以创建一个取决于您想要的特定版本的spotabcXXXX.dll的激活上下文,然后您可以在调用LoadLibrary()之前激活上下文。

无论哪种方式,即使调用进程的其他部分想要使用不同版本的spotabcXXXX.dll,您的插件也将绑定到该版本的spotabcXXXX.dll

© www.soinside.com 2019 - 2024. All rights reserved.