2011-10-09 52 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)。