2010-12-09 107 views
1

我有一個用本地C++編寫的DLL。 Visual Studio項目名稱爲MyDll,它編譯爲輸出目錄中名爲MyDll.dll的文件。重命名DLL會導致使用它的代碼崩潰

編譯後,我將它重命名爲MyDll2.dll。 (這個例子看起來很愚蠢,但我有一個很好的重命名的理由。)

用C++/CLI編寫的第二個項目使用這個DLL。

在編譯時,此項目引用MyDll.lib(在編譯MyDll時生成),以便能夠使用dll中定義的類。

在運行時,要加載DLL,我調用LoadLibrary,並將文件C:\...\MyDll2.dll(它實際上在同一個文件夾中)的完整路徑傳遞給它。它成功加載,如LoadLibrary的返回值所示。

在我使用DLL中定義的類的代碼中第一次出現(只是在棧中聲明一個對象)時,它崩潰了SEHException(這些例外沒有提供有關崩潰原因的任何信息...... )

這隻會發生,如果我做了重命名的一步。如果我將它保留爲MyDll.dll並在該文件上調用LoadLibrary,則一切正常。所以這顯然是由於重命名。

任何想法爲什麼?我不允許重命名DLL嗎?

(編輯:通過提供更多的細節澄清)

+1

您的應用程序是否具有該DLL的句柄(使用Procexp來說明)? – Benoit 2010-12-09 11:00:59

回答

2

建立一個dll時,鏈接器還會生成一個lib文件,用於在可執行文件中鏈接。這個lib文件包含從中導入導出的函數和數據的dll名稱。所以你的可執行文件中引用了最初的名稱dll。

1

你爲什麼要重命名的DLL它已經加載之後?在調用LoadLibrary之後,不應該重命名DLL。我很驚訝操作系統甚至會允許你這樣做。

+0

我不知道。在編譯完成之後,我將它重命名,然後再運行任何東西。 – Laurent 2010-12-09 14:01:30

1

在這種情況下,我將不得不重新編譯更改文件名

是你做的,在調用LoadLibrary()參數必須當您重命名DLL改變。解決你真正的問題,聽起來你並不像檢查LoadLibrary()的返回值。當它返回NULL時拋出一個Win32Exception。

+0

很明顯,參數是DLL的實際名稱......它加載正常,我檢查返回值,這表示成功。但是稍後當我使用DLL中的類時,它會因SEHException而失敗。 – Laurent 2010-12-09 14:03:17

1

我同意埃德溫。 lib文件指向導出的函數,還包含編譯時dll的名稱。

0

我不知道是否有人會在一年後閱讀此文,但爲什麼OP甚至LoadLibrary'ing這個重命名的DLL時,它已經靜態鏈接?這是兩件不同的事情。我認爲OP的應用程序由於缺少MyLib.dll而崩潰,在靜態鏈接之後需要,LoadLibrary與它無關,OP可以省略MyLib2.dll的LoadLibrary,結果將完全相同。唯一我無法解釋的是未知錯誤。

相關問題