2017-06-13 23 views
6

我正在寫一個Windows 32位程序,可以使用多個可能的DLL中的一個。所以它會嘗試加載每個dll,使用SysUtils.SafeLoadLibrary,如果加載成功,它會使用該dll。有沒有什麼辦法來捕獲錯誤,如果加載DLL無法找到依賴關係?

不幸的是其中一些dll與其他dll靜態鏈接。這些dll可能從計算機中丟失。在這種情況下,我得到的對話框,告訴我

[myprogram]:[myprogram.exe]系統錯誤

程序無法啓動,因爲[一些DLL名稱]從您的計算機中缺少。嘗試重新安裝程序來解決這個問題。」

按該對話框中的OK按鈕後,程序會取得錯誤代碼,並試圖在其他DLL,然後正常工作之一。

而不是顯示?該對話框我想我的程序靜靜地忽略它的用戶

我如何能夠做到這

如果它的事項:我的程序是用Delphi編寫的2007年Windows版本是Windows 8.1,但程序還應該與其他Windows版本> =一起使用Windows XP。我試過SetErrorMode(SEM_FAILCRITICALERRORS)但它沒有任何區別。

+0

請參閱[此問題](https://stackoverflow.com/q/44430822/1889329)。 – IInspectable

+0

@IInspectable謝謝,但沒有答案只有一個評論。如果我正確理解該評論,我將不得不修改這些DLL才能完成這一點,這是我不能做到的。 – dummzeuch

+0

從你的問題中不清楚你是否控制你試圖加載的DLL。 – IInspectable

回答

2

SafeLoadLibrary將錯誤模式設置爲您作爲參數提供的值,然後在LoadLibrary調用返回後恢復它。很可能您沒有爲該參數提供值,在這種情況下,會傳遞默認值SEM_NOOPENFILEERRORBOX。在這種情況下,它可能會禁用SEM_FAILCRITICALERRORS這可以解釋您看到的行爲。

您可以在每次撥打SafeLoadLibrary時通過SEM_FAILCRITICALERRORS來解決問題。或者,或許更好的辦法是通過當前的錯誤模式。然而這很難獲得。在Vista和更高版本中,您可以撥打GetErrorMode。但在舊版本的,你必須這樣做:

ErrorMode := SetErrorMode(0); 
SetErrorMode(ErrorMode); 

因爲這是一個過程範圍的設置,你有兩個電話之間的機會之窗,以SetErrorMode,對於被人抓住把柄多線程應用程序。

坦率地說,我認爲您應該在啓動時在進程的整個生命週期中一次調用SetErrorMode。考慮到這一點,我會迴避SafeLoadLibrary

如果你想利用其他功能,即防止浮點控制狀態的變化,那麼你應該自己實現這個功能,在我看來。

+3

請注意,Windows 7 +也有'(Get | Set)ThreadErrorMode()'。 –

相關問題