2011-02-08 81 views
3

我從DLL調用一個函數,就像這樣:接住一個DLL崩潰在C/C++

__declspec (dllimport) bool dll_function(...); 

int main() { 
    [...] 
    if (dll_function(...)) { 
    [...] 
    } 
} 

在某些情況下,我傳遞給DLL函數的數據會導致的崩潰DLL。是否有可能捕捉到這個,所以我的應用程序不會崩潰(不修改由我創建的DLL)?

+2

該dll是否會拋出異常?或者它是一個錯誤? – Marlon 2011-02-08 23:50:53

+0

該DLL不會引發異常,我猜測它嘗試訪問無效內存,Windows提供了一個典型的錯誤對話框,之後,我的應用程序將不會繼續運行。 – schnaader 2011-02-08 23:52:53

+0

我們可以看到這些功能嗎? – GManNickG 2011-02-08 23:54:12

回答

4

您可以使用MSVC編譯器中的__try和__except關鍵字捕獲AV。並非所有有用的東西,你都不知道造成了什麼樣的損害。您的程序狀態可能已損壞。例如堆可能被炸燬,導致隨後的隨機故障。在自己的進程中託管DLL並使用IPC與之交談是唯一體面的方法。

0

我不確定這是否是問題,請嘗試指定正確的調用約定。 (__stdcall,__cdecl等)。

如果這不是問題,我們需要看看你傳遞給函數的內容以及函數代碼,如果你有的話。

2

在某些情況下,我傳遞給 的DLL函數的數據將導致DLL的崩潰 。是否有可能趕上這個 所以我的應用程序不會崩潰爲 以及?

如果只使用有效數據調用函數,是不是可以防止dll崩潰?無論如何,這應該是最好的解決方案 - 但不知道你想使用哪個dll很難說清楚。但在大多數情況下,你應該有一個想法是什麼「數據」正是導致的崩潰......

1

試着看一下:由奧列格Starodumov

http://msdn.microsoft.com/en-us/library/ms680634%28v=vs.85%29.aspx

強制過濾代碼(www.debuginfo.com)

http://www.debuginfo.com/articles/debugfilters.html

然而,這是一個頂級過濾器,而不是一個try/catch。你也許可以重新啓動你的過程。

您可能需要使用__try作爲例外。再說一次,解決問題或者只是崩潰比試圖捕獲它更好。 我同意其他人,而不是壓制或隱藏崩潰,你應該修復它。我不知道你能從崩潰中恢復得多好 - 在這樣的事情之後繼續執行會有用嗎?