2011-08-31 54 views
1

我正在運行一個進程,其中COMCTL32.DLL被加載兩次,一次是5.82.7601.17514版本,一次是6.10.7601.17514版本。舊版本由程序鏈接的一些舊式DLL加載,另一個版本由較新的DLL加載。當COMCTL32.DLL被加載兩次時GetModuleHandle和GetProcAddress

如果我使用GetModuleHandle (L"COMCTL32.DLL")我無法控制得到解決的DLL。

當我呼叫GetProcAddress達到,例如TaskDialogIndirect,我得到一個空指針回來,這當然是因爲我回到了傳統DLL的句柄。

那麼,是否有一些方法可以在加載這兩個DLL時獲取地址,例如TaskDialogIndirect

如果不是,我可以以某種方式確保該過程加載6.10版本而不是5.82,希望我們的傳統DLL可以在COMCTL32的較新版本上正常工作?

+0

可能的快速解決方法是使用File + Open + File在Visual Studio中打開DLL的副本並刪除清單資源。 –

+0

最後,我們通過確定應用程序使用2new「外觀」來解決問題,而不是刪除它,但是新外觀(COMCTL32 v6)有幾個兼容性問題 –

回答

5

我想你不得不使用GetProcAddress()而不是隱式鏈接,因爲你希望你的應用程序在任務對話框不可用的XP上運行。

我可以看到三個選項供您:

  1. 使用隱式連接,而是使用延遲加載由MS工具鏈支持。我不是100%肯定會給你正確的comctl32,但它是值得一試。
  2. 使用activation context API以確保在致電LoadLibrary()時comctl32 v6清單正在運行。請致電LoadLibrary()而不是GetModuleHandle()以確保您獲得清單魔法。
  3. 枚舉進程中的所有模塊並選擇正確版本的comctl32。有一個comprehensive example of how to do this on MSDN

激活上下文方法是最乾淨的解決方案,但激活上下文API可能會很棘手。我個人曾用它來確保Excel COM插件鏈接到comctl32 v6。

模塊枚舉方法實施起來很快,有點髒,但會很好地工作。

+0

我們會給(3)一個嘗試,因爲它似乎是我們的代碼需要做的一個很好的替代品。我沒有意識到*激活上下文API *,謝謝你指點我。 –

+0

激活API終於不需要了。能夠修復遺留代碼,以便鏈接到「COMCTL32」v6。 –

+1

非常感謝David,這確實有助於解決我們所遇到的一個主要問題,即將寫出一份報告。 – Chad

相關問題