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

时间:2009-04-20 18:38:11

标签: winapi com activex

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

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

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

谢谢,   Velu

5 个答案:

答案 0 :(得分:1)

每个DLL实例只应调用一次

DLL_PROCESS_ATTACH。 。 。 DLL是否在同一个基地址加载,即DllMain中的HINSTANCE是否相同?它们是从完全相同的路径加载的吗?不同的路径导致不同的加载模块。它是在两个负载之间卸载的吗?您确定看到的是DLL_PROCESS_ATTACH而不是DLL_THREAD_ATTACH吗?

答案 1 :(得分:1)

LoadLibraryEx包含有关如何处理dll的额外标志。我怀疑这就是你看到它出现不止一次的原因。

答案 2 :(得分:0)

一种解决方法是使用singleton-ish初始化函数保护您的全局数据。

你有多少全球结构?

答案 3 :(得分:0)

只要进程加载DLL,就会调用DLL_PROCESS_ATTACH。

使用计数器确定附加了多少进程,并且仅在第一个进程附加时进行初始化。

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

答案 4 :(得分:0)

我不确定,但我认为观察结果可以通过以下事实来解释:您引用的dll是实例化定义为STA(单线程单元)的COM(ActiveX)对象。任何引用STA com对象的.Net dll都会在内存中为使用这些COM对象的每个线程加载一个新图像。 至少那种看起来发生在我们身上的行为。