2009-08-27 69 views
7

我說的是win32 dll,那些普通的pe文件。與我在explorer.exe過程中看到的相比,我在做測試後感到困惑。我們能否在同一個進程中加載​​2個同名的DLL

  1. 我寫了一個測試用以下模塊:(C++)
    DLLLoader.exe鏈接A.DLL在相同的文件夾中。
    B.dll鏈接到另一個文件夾中的A.dll(2)。 (A.dll(2)是與A.dll完全不同的DLL,但名稱相同)
    DLLLoader.exe將通過:: LoadLibrary顯式加載B.dll。
    現在我啓動DllLoader.exe,首先A.dll會被加載,但是當它試圖加載B.dll時,它只是失敗了:我懷疑這是因爲B.dll認爲A.dll已經在加載過程中,但事實上,加載的不是B.dll想要的那個,導入/導出表不能匹配,所以B.dll加載失敗。
    這似乎告訴我們,我們無法在同一個進程中加載​​2個同名的dll,即使它們具有不同的路徑。

  2. 但是,當我使用Process Explorer的監測在Windows的Explorer.exe進程中加載​​的模塊,我可以看到以下加載的DLL 2,用同一個名字:
    COMCTL32.DLL用戶體驗控件庫C:\ WINDOWS \ WinSxS文件... \ COMCTL32.DLL
    COMCTL32.DLL通用控件庫C:\ WINDOWS \ SYSTEM32 \ COMCTL32.DLL

可以在任何你提供一些線索這燈?

回答

6

它基本上取決於如果您加載DLL的完整路徑或只有文件名。該LoadLibraryEx文檔涵蓋這很好:

如果lpFileName的對象不包括路徑 並有不止一個裝載 模塊具有相同的基本名稱和 擴展,該函數返回一個 句柄模塊首先加載 。

+0

因此爲了加載(基於DLL依賴),我們只能有1個DLL加載相同的名稱。 –

相關問題