当GDI资源不足时,以编程方式捕获窗口关闭事件

Programmatically catching windows close event when out of GDI resources

本文关键字:方式捕 窗口 事件 编程 资源 GDI      更新时间:2023-10-16

我正在尝试捕获进程中所有意外终止。

我已经使用这些函数来捕获我能想到的所有未处理的错误和异常,但这还不够:

    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错误事件吗?
我相信一定有办法重载它并改变回调函数。

还有,有没有人知道其他奇怪的情况,这些功能只是不够的?

注意:

没有捕获的确切错误是"所需资源不可用"。
这是当你创建了很多GDI对象而不释放它们时造成的。
程序将崩溃,因为在内存耗尽之前没有足够的资源。

  1. 你列出的一些函数(例如SetUnhandledExceptionFilter)为当前线程设置处理程序。因此你应该在每个线程中调用它们。
  2. 您可以添加vector Exception Handling到列表(AddVectoredExceptionHandler)。

如果你使用的是Visual c++, __try __finally通常会奏效。注意,这不是一个可移植的解决方案。

好的,问题解决了。

它赶上了坠机。

问题是,作为从崩溃中抢救数据的过程的一部分,它打开了一个表单,该表单应该通知用户发生了错误。

当然,我们没有GDI对象,所以Form不能被绘制,所以在它本身抛出和异常,我们有另一个未处理的异常,进程真的崩溃了