2011-10-09 55 views
0

我試圖捕捉在我的過程中的所有意外終止。以編程方式捕捉窗口關閉事件時,GDI資源不存在

我使用這些功能來捕捉所有未處理的錯誤和異常,我能想到的,但仍然是不夠的:

SetUnhandledExceptionFilter(OnUnhandledNativeException); 

    set_terminate(set_terminateHandler); 

    set_unexpected(set_unexpectedHandler); 

    _set_purecall_handler(set_purecallHandler); 

    _set_new_handler(HandleProgramMemoryDepletion);  

    _set_invalid_parameter_handler(InvalidParameterHandler); 

    signal(SIGABRT, sigabrt_handler); 
    signal(SIGINT, sigabrt_handler); 
    signal(SIGTERM , sigabrt_handler); 

這些功能幾乎趕上任何錯誤的應用程序。

但是,當應用程序由於GDI故障而終止(例如GDI超出資源)時,將調用這些函數中的非函數。

有誰知道我可以如何捕捉GDI錯誤事件?
我確定必須有一些方法來重載它並改變回調函數。

而且,有沒有人知道任何其他奇怪的情況下,這些功能是不夠的?

注:

確切的錯誤,它不是追趕是「A所需的資源不可用」。
這是在創建大量GDI對象並且不釋放它們時引起的。
由於在內存不足之前沒有足夠的資源,程序會崩潰。

+0

也許你應該修復資源泄漏? – Ferruccio

+0

在修復問題之前,需要製作一個組件來查找問題。 –

回答

0

好的,解決了這個問題。

它抓住了崩潰。

問題是,作爲從崩潰中拯救數據的過程的一部分,它打開了一個表單,該表單應該通知用戶發生了錯誤。

當然,我們沒有GDI對象,所以表單不能被繪製,所以本身拋出異常,我們有另一個未處理的異常,並且這個過程真的崩潰了。

0

如果你在Visual C++ __try __finally通常會做的伎倆。請注意,這不是一個便攜式解決方案。

+0

我試圖替換回調,所以我可以使用外部DLL來監視應用程序的崩潰。這是爲了掩蓋程序員忘記嘗試/捕捉他的方法的情況。 –

0
  1. 列出的一些函數(例如SetUnhandledExceptionFilter)爲當前線程設置處理程序。因此你應該在每個線程中調用它們。
  2. 您可以將向量異常處理添加到列表(AddVectoredExceptionHandler)。