Windows中Paint事件中的异常和访问冲突

时间:2010-05-25 12:03:06

标签: c++ windows exception-handling access-violation onpaint

执行一些新代码后,我的C ++应用程序开始出现异常(屏幕更新不正确或不完整,有时根本没有屏幕更新)。 过了一会儿,我们发现新代码导致访问冲突。奇怪的是,应用程序只是继续运行(但屏幕更新不正确)。

起初我们认为问题是由“尝试捕获(...)”构造引起的(由一个过度活跃的前同事放在那里),但几个小时后(仔细检查调用堆栈,添加许多断点, ...)我们发现如果在绘图事件中存在访问冲突,Windows会捕获它,并继续运行该应用程序。

  • 这是正常行为吗?
  • Windows在绘制事件期间捕获异常/错误是否正常?
  • 有没有办法禁用它? (如果没有,这意味着我们必须始终在调试器中运行,并在测试代码时启用所有异常)。

编辑:

  • 在XP上正确崩溃(访问冲突后的通缉行为)
  • 在Vista和Windows 7上,应用程序继续运行

2 个答案:

答案 0 :(得分:2)

我的直接反应是,这听起来像资源泄漏,当您不再拥有正确类型的资源时会发生故障。

[我删除了之前答案的其余部分,因为根据Patrick的评论和一些调查,显然不适用于手头的问题。 ]

继Patrick的评论之后,我做了一个快速测试并重复了Windows 7下的行为。我开始使用一个真正的 minimal 程序(VS 2008为Win32项目生成的基本程序)和我添加的 all 是对不存在的地址的写入。果然,你根本没有发现任何不好的迹象。

只是为了笑容,我做了一个快速测试,看看它究竟是如何对异常作出反应的。对于它的价值,它不会在异常之后恢复,它只是捕获它并跳过WM_PAINT处理程序中的其余代码。

我已经完成了MSDN的一些工作,但到目前为止还没有找到任何文档来解释它是如何或为什么会出现的,是否可以被禁用,如果是这样,或者其他什么。我必须同意:这真的是一个严重的问题 - 如果我导致访问冲突(不,不可能发生!)我希望程序尽可能彻底和快速地崩溃。掩盖一个错误(特别是一个严重的访问违规)是一个非常糟糕的主意!

答案 1 :(得分:2)

这是一个已知的缺陷。检查此修补程序。 http://support.microsoft.com/kb/976038