我有一个使用MSVS2005创建的MFC驱动的基于对话框的应用程序。这是我的问题一步一步来。我有我的对话和相应的点击处理程序按钮,这样的代码:OpenGL在MFC基于对话框的应用程序中抑制异常
int* i = 0;
*i = 3;
我正在运行的程序的调试版本,当我按一下按钮,Visual Studio的捕捞重点和警报“访问冲突写入位置“例外,程序无法从错误中恢复,我所能做的就是停止调试。这是正确的行为。
现在我添加一些OpenGL的初始化代码在OnInitDialog()
方法:
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);
当然,这不正是我做什么,这是我的代码的简化版本。那么现在奇怪的事情开始发生:所有的初始化都很好,在OnInitDialog()
中没有错误,但是当我点击按钮...没有任何异常被抛出。什么都没发生。完全一样。如果我在*i = 3;
上设置了一个断点并按下F11,处理函数立即停止,焦点返回到应用程序,继续运行良好。我可以再次点击按钮,同样的事情会发生。
看起来好像有人已经处理了发生访问冲突的异常并默默地将执行返回到主应用程序的消息接收周期。
如果我评论行wglMakeCurrent(DC, hrc);
,所有的工作都像以前一样正常,抛出异常并且Visual Studio捕获它并显示带有错误消息的窗口,并且之后程序必须终止。
我在安装了网站的Windows 7 64位,NVIDIA GeForce 8800和最新驱动程序(11.01.2010)下遇到此问题。我的同事拥有32位的Windows Vista,并且没有这样的问题 - 在这两种情况下都会抛出异常并导致应用程序崩溃。
好,希望好人能帮助我:)
PS的问题最初是在那里下this主题贴。
这很有趣,我最近有同样的问题......如果你在一个try-catch块包装异常抛出代码,它将捕获异常那里,但如果异常传播到MFC代码它似乎吞下了。我想一个潜在的解决方法是自己使用try-catch块。 – AshleysBrain 2010-01-29 15:52:01
我可以证实这个问题,它与Windows Vista 64位和Windows 7 64位上的OpenGL有关。寻找答案本人:) – ralphtheninja 2010-02-12 16:38:28
这似乎类似于我的问题: http://stackoverflow.com/questions/2622200/exceptions-silently-caught-by-windows-how-to-handle-manually – 2010-04-12 13:25:32