2010-10-15 94 views
3

我給了我的軟件用戶從開放文件對話框中選擇DLL的機會(所以我的用戶可以從我的網站下載DLL並將其用於主項目)。一切工作正常,它甚至可以發現,DLL是由我提供或選擇一個無效的dll.but問題引發如果用戶選擇一個重命名的文件(例如:apple.txt文件重命名爲Apple.dll)。我輸入了這樣的代碼德爾福loadlibrary錯誤()

嘗試 dllHandle:= LoadLibrary(pwidechar(openfiledialog1.filename));

{showmessage如果它不是一個dll(但它可以是任何DLL,它檢查這是我的DLL或第三方版本)}

末;德爾福表示

錯誤消息「壞庫圖像中選擇」

但嘗試,如果用戶選擇無效的DLL它顯示了自己的錯誤消息,奏響了抓不工作。

誰能幫助我,我使用德爾福2009年

回答

11

有沒有例外,趕上因爲當LoadLibrary失敗,一個異常沒有提高;它只是返回'0'。

您應該檢查'dllHandle'是否爲0,如果是,則通過使用GetLastError來記錄錯誤信息。或者您可以使用在RTL的Win32Check功能,將提高與相應的錯誤消息的異常:

編輯:「調用LoadLibrary」的文件指出:To enable or disable error messages displayed by the loader during DLL loads, use the SetErrorMode function.所以,如果你不想操作系統顯示另一個對話框你調用LoadLibrary之前設置錯誤模式。)

var 
    dllHandle: HMODULE; 
    ErrorMode: UINT; 
begin 
    if OpenDialog1.Execute then begin 
    ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); // disable OS error messages 
    try 
     dllHandle := LoadLibrary(PChar(OpenDialog1.FileName)); 
    finally 
     SetErrorMode(ErrorMode); 
    end; 
    if Win32Check(Bool(dllHandle)) then begin // exception raised if false 
     // use the libary 

     end; 
    end; 
end; 
+0

感謝Sertac Akyuz,我認爲它的工作原理 – VibeeshanRC 2010-10-15 13:40:46

+0

要添加到這一點,調用LoadLibrary()可以改變加載的DLL/EXE的FPU控制字,所以最好使用SafeLoadLibrary()代替。 – 2010-10-19 04:44:41