c – WndProc中的64位异常无声地失败

Windows 7 32位下运行时,以下代码将导致硬故障:
void CTestView::OnDraw(CDC* /*pDC*/)
{
    *(int*)0 = 0; // Crash

    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // Todo: add draw code for native data here
}

但是,如果我在Windows 7 64bit上尝试这个,我只是在输出窗口中得到它:

First-chance exception at 0x13929384
in Test.exe: 0xC0000005: Access
violation writing location 0x00000000.
First-chance exception at 0x77c6ee42
in Test.exe: 0xC0150010: The
activation context being deactivated
is not active for the current thread
of execution.

这是什么原因?我知道这是一个硬件异常(http://msdn.microsoft.com/en-us/library/aa363082.aspx),但为什么在32位和64位下运行的差异?我该怎么做才能正确处理这类错误?因为它们应该被捕获和修复,而不是目前正在发生的事情,Windows只是继续向应用程序发送消息并让它运行(因此用户和开发人员完全没有意识到实际发生了任何问题).

更新:
我们的常规崩溃报告软件使用SetUnhandledExceptionFilter但不会在x64上调用WndProc中的硬件异常.有没有人有关于此的任何信息,或解决方法

UPDATE2:
我在Microsoft Connect上报告了这个问题:
https://connect.microsoft.com/VisualStudio/feedback/details/550944/hardware-exceptions-on-x64-machines-are-silently-caught-in-wndproc-messages

解决方法

在针对访问冲突异常展开堆栈时会引发另一个异常.被吞噬,导致AV消失.您需要找出正在执行此操作的代码.调试异常,检查Win32异常的Thrown框.调试器将在第一个停止,继续.当它再次停止时检查调用堆栈.如果您无法弄明白,请将其添加到您的问题中.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...