【发布时间】:2010-01-29 15:25:45
【问题描述】:
我有一个使用 MSVS2005 创建的 MFC 驱动的基于对话框的应用程序。这是我的问题一步一步。我的对话框和相应的点击处理程序上有按钮,代码如下:
int* i = 0;
*i = 3;
我正在运行调试版本的程序,当我单击按钮时,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);
当然,这不完全是我所做的,它是我的代码的简化版本。那么现在奇怪的事情开始发生:所有初始化都很好,OnInitDialog() 没有错误,但是当我单击按钮时......没有抛出异常。没发生什么事。完全没有。如果我在*i = 3; 处设置断点并在其上按 F11,则处理程序函数会立即停止并将焦点返回到应用程序,该应用程序继续运行良好。我可以再次单击按钮,同样的事情会发生。
似乎有人已经处理了发生的访问冲突异常,并默默地将执行返回到主应用程序消息接收周期。
如果我注释 wglMakeCurrent(DC, hrc); 行,一切正常,抛出异常,Visual Studio 捕获它并显示带有错误消息的窗口,然后必须终止程序。
我在安装了网站上提供的最新驱动程序(2010 年 1 月 11 日)的 Windows 7 64 位、NVIDIA GeForce 8800 下遇到了这个问题。我的同事使用的是 32 位 Windows Vista 并且没有这样的问题 - 在这两种情况下都会引发异常并且应用程序崩溃。
好吧,希望好人能帮助我:)
PS 这个问题最初是在this 主题下发布的。
【问题讨论】:
-
这很有趣,我最近遇到了同样的问题......如果你将异常抛出代码包装在 try-catch 块中,它会在那里捕获异常,但如果异常传播到 MFC代码它似乎被吞没了。我想一个潜在的解决方法是自己使用 try-catch 块。
-
我可以确认这个问题,它与 windows vista 64 位和 windows 7 64 位上的 OpenGL 有关。自己寻找答案:)
-
这似乎与我的问题相似:stackoverflow.com/questions/2622200/…
标签: debugging opengl visual-studio-2005 mfc exception-handling