當我在IE中嵌入相同的代碼並啓動頁面時,我有一個ActiveX控件(foo.dll)。我可以看到進程資源管理器顯示從同一位置加載的foo.dll的兩個實例。在一個進程中加載兩次相同的DLL
這會導致DLL_PROCESS_ATTACH被調用兩次,全局數據結構被初始化兩次。
有沒有辦法解決這個問題? Windows加載程序如何工作?
感謝, Velu
當我在IE中嵌入相同的代碼並啓動頁面時,我有一個ActiveX控件(foo.dll)。我可以看到進程資源管理器顯示從同一位置加載的foo.dll的兩個實例。在一個進程中加載兩次相同的DLL
這會導致DLL_PROCESS_ATTACH被調用兩次,全局數據結構被初始化兩次。
有沒有辦法解決這個問題? Windows加載程序如何工作?
感謝, Velu
一個解決辦法是用一個單十歲上下的初始化函數來保護您的全局數據。
你有多少個全球性結構?
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對象的每個線程加載一個新的映像。至少這是看起來發生在我們身上的行爲。
任何機會是這是一個混合模式的應用程序?如果是這樣,那麼如果你也有多個AppDomain,那麼可以加載相同的DLL,但是在每個AppDomain中。 – 2012-11-28 13:39:08
我以前見過這裏曾經被映射爲「圖像」,另一個作爲「數據」在不同的基地址和大小 – paulm 2015-03-30 13:12:38