Winapi 同一个DLL在一个进程中加载两次

Winapi 同一个DLL在一个进程中加载两次,winapi,com,activex,Winapi,Com,Activex,当我将ActiveX控件(foo.dll)嵌入IE并启动页面时,我有一个ActiveX控件(foo.dll)。我可以看到process explorer显示了从同一位置加载的foo.dll的两个实例 这会导致DLL_进程_ATTACH被调用两次,全局数据结构被初始化两次 有办法解决这个问题吗?windows加载程序是如何工作的 谢谢, Velu一种解决方法是使用单例初始化功能保护全局数据 您有多少全局结构?DLL\u PROCESS\u ATTACH在进程加载DLL时被调用 使用计数器确定连接了

当我将ActiveX控件(foo.dll)嵌入IE并启动页面时,我有一个ActiveX控件(foo.dll)。我可以看到process explorer显示了从同一位置加载的foo.dll的两个实例

这会导致DLL_进程_ATTACH被调用两次,全局数据结构被初始化两次

有办法解决这个问题吗?windows加载程序是如何工作的

谢谢,
Velu

一种解决方法是使用单例初始化功能保护全局数据


您有多少全局结构?

DLL\u PROCESS\u ATTACH在进程加载DLL时被调用

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


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

DLL\u PROCESS\u ATTACH
每个DLL实例只应调用一次。DLL是否加载在相同的基址,即DllMain中的HINSTANCE是否相同?它们是从完全相同的路径加载的吗?不同的路径导致加载的模块不同。它是在两个负载之间卸载的吗?您确定看到的是
DLL\u进程\u附加
而不是
DLL\u线程\u附加

包含如何处理DLL的额外标志。我怀疑这就是为什么您多次看到它出现的原因。

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

Hi Micheal,令人惊讶的是,这两个实例都是从同一路径加载的,而我所指的是DLL\u进程\u附件..DLL是在这两个路径之间卸载的吗?你能把代码发布到你的DllMain吗?这是一个混合模式的应用程序吗?如果是这样,那么如果您也有多个AppDomain,那么可以加载相同的DLL,但在每个AppDomain中都可以加载。我以前见过这样的情况,其中一个被映射为“图像”,另一个被映射为不同基地址和大小的“数据”