2013-04-25 59 views
3

我有A.DLLB.DLLDLL加載兩次使用調用LoadLibrary

使用VS 2010,我設置C++函數斷點在A.DLL項目並使用procexp.exe看到當前加載的DLL什麼。顯然,加載了A.DLL

我需要從這個函數調用B.DLL。注意:B.DLLA.DLL有依賴庫。這個庫被稱爲A.LIB

使用LoadLibrary,我執行語句:

HANDLE hLib = LoadLibrary("B.DLL"); 

執行完這條線,我看procexp.exe一次。 A.DLL被加載兩次!如果我刪除對B.DLLA.LIB依賴項,則不會發生。 Process Explorer報告A.DLL的兩個實例具有不同的基址,因此它們確實是不同的模塊。

我的問題是爲什麼這會加載A.DLL的另一個實例?是否有可能實現A.DLL已經加載?

+0

他們是在同一* *'A.DLL'?你確定你沒有從不同的文件路徑加載兩個不同的'A.DLL'嗎? – 2013-04-25 18:47:31

+0

procexp顯示它們來自相同的文件路徑,相同的版本和相同的時間戳。由於某種原因,它實際上創建了相同的DLL兩次 – ryrich 2013-04-25 18:48:56

+1

當您調用LoadLibrary(「B.DLL」)時,加載'A.DLL'的第二個實例''查看'B.DLL'的PE導入表。爲此使用dumpbin。記下用於指定'A.DLL'的確切名稱。然後對具有依賴於'A.DLL'的主機exe執行相同的操作。它是一樣的嗎?我相信你在生成主機exe和'B.DLL'時使用相同的'A.LIB'文件。 – 2013-04-25 19:03:22

回答

0

所以我無法弄清楚爲什麼A.DLL被加載兩次的原因,所以我繼續前進,重構我的代碼,並提出了一個更好的解決方案。 (這結束了對我工作的罰款)

代替B.DLL其上A.DLL庫的依賴,我刪除了依賴和的,而不是具有通過A.LIB暴露出一些出口的功能,我用了一個function pointer該功能,並通過它通過我對LoadLibrary,GetProcAddress等的調用。

這樣做,它不會加載A.DLL兩次,現在一切都很好:)

相關問題