在一个进程中加载​​两次相同的DLL

问题描述:

当我在IE中嵌入相同的代码并启动页面时,我有一个ActiveX控件(foo.dll)。我可以看到进程资源管理器显示从同一位置加载的foo.dll的两个实例。在一个进程中加载​​两次相同的DLL

这会导致DLL_PROCESS_ATTACH被调用两次,全局数据结构被初始化两次。

有没有办法解决这个问题? Windows加载程序如何工作?

感谢, Velu

+0

任何机会是这是一个混合模式的应用程序?如果是这样,那么如果你也有多个AppDomain,那么可以加载相同的DLL,但是在每个AppDomain中。 – 2012-11-28 13:39:08

+0

我以前见过这里曾经被映射为“图像”,另一个作为“数据”在不同的基地址和大小 – paulm 2015-03-30 13:12:38

一个解决办法是用一个单十岁上下的初始化函数来保护您的全局数据。

你有多少个全球性结构?

DLL_PROCESS_ATTACH在进程加载DLL时调用。

使用计数器来确定连接了多少个进程,并且只在第一个进程连接时进行初始化。

您还需要在DLL的实例之间设置最多为share memory的东西,并将计数器存储在该实例中,以及您只需要初始化一次的全局内存。

DLL_PROCESS_ATTACH应该只对DLL的每个实例调用一次。 。 。 DLL是否加载在相同的基地址,即DllMain中的HINSTANCE是否相同?它们是否从完全相同的路径加载?不同的路径导致不同的加载模块。它是否在两次装载之间卸载?你确定你看到DLL_PROCESS_ATTACH而不是DLL_THREAD_ATTACH

LoadLibraryEx包含一个额外的标志为如何对待DLL。我怀疑这就是你看到它不止一次出现的原因。

我不确定,但我的问题来自事实,你所提到的DLL实例化一个COM(activeX)对象,它被定义为STA(单线程单元)。任何引用STA com对象的.net dll都会为使用这些COM对象的每个线程加载一个新的映像。至少这是看起来发生在我们身上的行为。