У меня есть диалоговое приложение на основе 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-bit, NVIDIA GeForce 8800 с последними драйверами (от 11.01.2010)доступно на сайте установлен.У моего коллеги 32-разрядная ОС Windows Vista и такой проблемы нет - исключение выдается, и в обоих случаях происходит сбой приложения.
Что ж, надеюсь, хорошие парни помогут мне:)
PS Проблема изначальногде размещено под этой темой.