当GDI资源不足时,以编程方式捕获窗口关闭事件
Programmatically catching windows close event when out of GDI resources
我正在尝试捕获进程中所有意外终止。
我已经使用这些函数来捕获我能想到的所有未处理的错误和异常,但这还不够:
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对象而不释放它们时造成的。
程序将崩溃,因为在内存耗尽之前没有足够的资源。
- 你列出的一些函数(例如SetUnhandledExceptionFilter)为当前线程设置处理程序。因此你应该在每个线程中调用它们。
- 您可以添加vector Exception Handling到列表(AddVectoredExceptionHandler)。
如果你使用的是Visual c++, __try __finally通常会奏效。注意,这不是一个可移植的解决方案。
好的,问题解决了。
它赶上了坠机。
问题是,作为从崩溃中抢救数据的过程的一部分,它打开了一个表单,该表单应该通知用户发生了错误。
当然,我们没有GDI对象,所以Form不能被绘制,所以在它本身抛出和异常,我们有另一个未处理的异常,进程真的崩溃了
相关文章:
- 如何以滑动窗口方式从 std::bitset 读取位并将它们转换为 int?
- 如何以编程方式使窗口全屏显示?
- 如何以编程方式更改基于对话框的窗口的大小和位置?
- 以编程方式清除Visual Studio输出窗口
- 在Gnome或KDE中以编程方式移动桌面上的应用程序窗口
- 为什么使用OpenGL上下文创建的窗口会以透明方式打开
- 系统范围的热键快捷方式(Windows/Qt):防止窗口锁定
- 在窗口开始菜单中创建快捷方式
- 我想在窗口下使用 c++ 以某种基本方式表示西里尔字符
- 告诉 PDCurses 以编程方式使窗口与物理屏幕大小相同的方法
- 鼠标在窗口中的呈现方式
- 以编程方式在窗口中获取活动连接
- 在C++中,在窗口中播放示例缓冲区最常见的方式是什么
- 如何获取窗口的命令行"打开方式.."功能?
- 如何使用C/C++以编程方式检查窗口中的系统文件夹
- QT扩展主窗口到其他类或不同的方式
- 如何以编程方式调用Windows 7中的Ctrl+Alt+Del窗口
- 如何在64位窗口中以编程方式模拟DllMain调用
- 在窗口上以编程方式隐藏应用程序
- 当GDI资源不足时,以编程方式捕获窗口关闭事件