我有一个ActiveX控件(foo.dll),当我在IE中嵌入它并启动页面时。我可以看到进程资源管理器显示了从同一位置加载的两个foo.dll实例。
这会导致DLL_PROCESS_ATTACH被调用两次,全局数据结构被初始化两次。
有没有办法解决这个问题? Windows加载器如何工作?
谢谢, Velu
答案 0 :(得分:1)
DLL_PROCESS_ATTACH
。 。 。 DLL是否在同一个基地址加载,即DllMain中的HINSTANCE是否相同?它们是从完全相同的路径加载的吗?不同的路径导致不同的加载模块。它是在两个负载之间卸载的吗?您确定看到的是DLL_PROCESS_ATTACH
而不是DLL_THREAD_ATTACH
吗?
答案 1 :(得分:1)
LoadLibraryEx包含有关如何处理dll的额外标志。我怀疑这就是你看到它出现不止一次的原因。
答案 2 :(得分:0)
一种解决方法是使用singleton-ish初始化函数保护您的全局数据。
你有多少全球结构?
答案 3 :(得分:0)
使用计数器确定附加了多少进程,并且仅在第一个进程附加时进行初始化。
您还需要在DLL的实例之间设置最多share memory,并将计数器存储在该实例中,以及您只需要初始化一次的全局内存。
答案 4 :(得分:0)
我不确定,但我认为观察结果可以通过以下事实来解释:您引用的dll是实例化定义为STA(单线程单元)的COM(ActiveX)对象。任何引用STA com对象的.Net dll都会在内存中为使用这些COM对象的每个线程加载一个新图像。 至少那种看起来发生在我们身上的行为。