У меня есть диалоговое приложение, управляемое MFC, созданное с помощью MSVS2005. Вот моя проблема шаг за шагом. У меня есть кнопка в моем диалоговом окне и соответствующий обработчик кликов с таким кодом:
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 Первоначально проблема была опубликована в этой теме.