2011-12-01 43 views
2

我遇到了一個我不明白的問題。我在我的應用程序中使用了一個DLL。這個DLL需要其他的DLL,我擁有所有的DLL。如果我把庫放在我的appliction文件夾中,一切正常。從非應用程序文件夾使用DLL時,會引發外部異常

但是,在應用程序文件夾中有一堆DLL看起來很難看,所以我想將它們移動到application \ lib子文件夾中。

現在,當我嘗試使用它的某些功能時,我得到了外部異常。

我只改變了一行代碼:

原代碼

DLLHandle := LoadLibrary(Pchar(ExtractFilePath(ParamStr(0)) + 'External.dll')) 

更改後的代碼

DLLHandle := LoadLibrary(Pchar(ExtractFilePath(ParamStr(0)) + 'lib\External.dll')) 

在這兩種情況下DLLHandle有一個手柄加載庫後。我還沒有得到任何錯誤調用GetProcAddress( DLLHandle, '[email protected]')

沒有例外後,和GetLastError返回值始終爲0

你有什麼想法可能是錯了嗎?

謝謝。

回答

1

需要加載的其他DLL必須位於系統路徑中才能找到它們。您的應用程序可以在您明確定義路徑時找到External.dll。嘗試將lib文件夾添加到您的系統路徑。

+0

感謝您的答案,不幸的是將文件夾添加到系統路徑沒有幫助。 – Wodzu

+0

系統路徑可能會使其工作,但它不是一個非常愉快的選項 –

+1

+1的診斷,但請不要亂搞我的系統路徑未經許可,你也可以註冊DLL的窗口,所以它知道在哪裏可以找到它沒有通過路徑。也應該更快。 (這是一個評論,因爲我不記得在哪裏/如何註冊DLL,沒有時間去找它)。 –

3

如果將DLL保存在與可執行文件相同的文件夾中,生活就會容易得多。這是加載庫時的first folder searched。要將所有DLL移動到可執行目錄的子文件夾中,需要所有DLL的協作。

很可能你有不合作的輔助DLL依賴關係。因此,EXE加載罰款,但然後A無法加載B.您可以進一步調試Dependency Walker在配置文件模式下運行。這是很有可能的一個輔助DLL正在加載隱式鏈接,並且這拋出和異常。無論原因如何,Depenency Walker都會引導您解決問題。

雖然您可以修改PATH變量,但這通常不可取。如果您確實選擇遵循此路線,則不要修改系統範圍,只需在第一個LoadLibrary之前修改運行時的可執行流程環境。只要所有的DLL鏈接都是使用GetProcAddress來顯式的,這個就成立了。

所有接受的智慧建議您將您的DLL放在與您的可執行文件相同的文件夾中。我會迴應這個建議。如果你這樣做,那麼你將能夠使用隱式鏈接,這將大大簡化你的代碼。

另一種選擇可能是放棄DLL並將所有內容直接鏈接到可執行文件中。除非你有一個插件類型架構,否則一個大的exe是迄今爲止最簡單的方法。

+0

謝謝大衛,正如我之前在評論中所說的那樣。即使設置系統範圍的dll路徑也不能解決問題。我會檢查這個問題的依賴沃克,從來沒有聽說過它。如果這會有所幫助,我將您的答案標記爲已接受。 – Wodzu

相關問題