OpenGL抑制MFC基于对话框的应用程序中的异常

Mik*_*ail 5 opengl debugging mfc exception-handling visual-studio-2005

我有一个使用MSVS2005创建的基于MFC驱动的基于对话框的应用程序.这是我一步一步的问题.我的对话框上有按钮和相应的点击处理程序,代码如下:

int* i = 0;
*i = 3;
Run Code Online (Sandbox Code Playgroud)

我正在运行程序的调试版本,当我点击按钮时,Visual Studio捕获焦点并警告"访问违规写入位置"异常,程序无法从错误中恢复,我所能做的就是停止调试.这是正确的行为.

现在我在OnInitDialog()方法中添加一些OpenGL初始化代码:

    HDC DC = GetDC(GetSafeHwnd());
    static PIXELFORMATDESCRIPTOR pfd =
    {
      sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
      1, // version number
      PFD_DRAW_TO_WINDOW | // support window
      PFD_SUPPORT_OPENGL | // support OpenGL
      PFD_DOUBLEBUFFER, // double buffered
      PFD_TYPE_RGBA, // RGBA type
      24, // 24-bit color depth
      0, 0, 0, 0, 0, 0, // color bits ignored
      0, // no alpha buffer
      0, // shift bit ignored
      0, // no accumulation buffer
      0, 0, 0, 0, // accum bits ignored
      32, // 32-bit z-buffer
      0, // no stencil buffer
      0, // no auxiliary buffer
      PFD_MAIN_PLANE, // main layer
      0, // reserved
      0, 0, 0 // layer masks ignored
    };

    int pixelformat = ChoosePixelFormat(DC, &pfd);
    SetPixelFormat(DC, pixelformat, &pfd);

    HGLRC hrc = wglCreateContext(DC);
    ASSERT(hrc != NULL);
    wglMakeCurrent(DC, hrc);
Run Code Online (Sandbox Code Playgroud)

当然这不是我所做的,它是我的代码的简化版本.好了,现在奇怪的事情开始发生了:所有初始化都很好,没有错误OnInitDialog(),但是当我点击按钮时......没有抛出任何异常.什么都没发生.完全没有.如果我在其上设置了一个断点并在其上*i = 3;按F11,则处理程序函数立即停止并将焦点返回给应用程序,该应用程序继续正常工作.我可以再次点击按钮,同样的事情会发生.

似乎有人处理了发生访问冲突的异常,并默默地将执行返回到主应用程序消息接收周期.

如果我对该行进行注释wglMakeCurrent(DC, hrc);,则所有工作都像以前一样正常,抛出异常并且Visual Studio捕获它并显示带有错误消息的窗口,之后必须终止程序.

我在安装了网站的Windows 7 64位NVIDIA GeForce 8800和最新驱动程序(11.01.2010)上遇到此问题.我的同事有32位Windows Vista并且没有这样的问题 - 抛出异常并且两种情况下应用程序崩溃.

好吧,希望好人帮助我:)

PS最初在主题下发布的问题.

ral*_*nja 3

好的,我找到了一些有关此的更多信息。就我而言,Windows 7 在调用我的 WndProc 并给我执行控制权之前安装KiUserCallbackExceptionHandler作为异常处理程序。这是由ntdll!KiUserCallbackDispatcher完成的。我怀疑这是微软为了防止黑客入侵SEH而采取的安全措施。

解决方案是用 try/ except 框架包装您的 wndproc (或 hookproc),以便您可以在 Windows 之前捕获异常。

感谢 Skywing http://www.nynaeve.net/

我们已经就这个问题联系了 nVidia,但他们说这不是他们的错误,而是微软的错误。您能告诉我您是如何找到异常处理程序的吗?您是否还有一些其他信息,例如微软的一些反馈?

我在 WinDbg 中使用“!exchain”命令来获取此信息。