2015-11-08 117 views
0

我有一個過程來調用一個名爲函數[主()]從一個DLL,這是主叫過程:在Delphi中調用DLL時的異常?

procedure call_dll(path:string); 
var 
    lib: HMODULE; 
    mainfn: procedure(); stdcall; 
begin 
if FileExists(path) then 
begin 
    try 
    lib := LoadLibrary(PAnsiChar(path)); 
    Win32Check(lib <> 0); 
    try 
     @mainfn := GetProcAddress(lib, 'main'); 
     Win32Check(Assigned(mainfn)); 
     mainfn(); 
    finally 
     FreeLibrary(lib); 
    end; 
    except 
    end; 
end; 
end; 

直到但每一件事情是工作的罰款,我的意思寫的正確路徑後DLL的一切工作沒有問題,但如果我在路徑參數中寫了一個錯誤的路徑(其他文件路徑),它顯示彈出錯誤,這不是一個Win32 DLL,但我不想打擾用戶這種類型錯誤,所以我需要一個函數來檢查DLL,如果它不是,那麼它會自動再次請求另一個文件,而不顯示彈出錯誤?

回答

1

這是你的代碼引發異常。您的代碼通過引發異常來明確地選擇處理錯誤。您的代碼在此提出例外情況:

Win32Check(lib <> 0); 

如果您不想引發異常,請不要使用Win32Check。相反,請檢查lib的值,並以任何您認爲合適的方式處理任何錯誤。

同樣的問題存在於您的其他使用Win32Check

當然,您正在捕獲所有異常,並捕獲所有異常處理程序。捕獲所有的異常處理程序通常是一個壞主意。我不明白你爲什麼包括這一點。我認爲你應該刪除它。

因此,如果在調試器外部運行時看到對話框,則表示系統正在生成對話框。您應該在啓動時通過呼叫SetErrorMode傳遞SEM_FAILCRITICALERRORS來禁用系統的錯誤消息對話框。

var 
    Mode: DWORD; 
.... 
Mode := SetErrorMode(SEM_FAILCRITICALERRORS); 
SetErrorMode(Mode or SEM_FAILCRITICALERRORS); 

的有些笨重雙呼叫這裏說明:http://blogs.msdn.com/b/oldnewthing/archive/2004/07/27/198410.aspx

+0

對不起,先生但心中已經由'showmessage();'每一行和錯誤是由'LIB後引起:=調用LoadLibrary(PAnsiChar (path));'不是'Win32Check'那麼該怎麼辦? –

+0

做我最後的段落說的。調用SetErrorMode來禁用這些對話框。你的代碼在處理錯誤的方式上是一團糟。我認爲你從某處複製代碼而不理解它。 –

+0

hhhhhhhh這是真的我是一個初學者,但有一天,我將能夠寫我自己的功能;),無論如何,我會嘗試你說什麼:)只是一秒 –