Tôi có một ứng dụng dựa trên hộp thoại MFC được tạo bằng MSVS2005. Đây là vấn đề của tôi từng bước. Tôi có nút khi nhấp handler thoại và tương ứng của tôi với mã như thế này:OpenGL ngăn chặn ngoại lệ trong ứng dụng dựa trên hộp thoại MFC
int* i = 0;
*i = 3;
Tôi đang chạy phiên bản debug chương trình và khi tôi nhấp vào nút, Visual Studio sản lượng đánh bắt tập trung và cảnh báo "Truy cập viết vi phạm vị trí "ngoại lệ, chương trình không thể phục hồi từ lỗi và tất cả những gì tôi có thể làm là dừng gỡ lỗi. Và đây là hành vi đúng đắn.
Bây giờ tôi thêm một số mã OpenGL khởi trong phương pháp 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);
Tất nhiên đây không phải là chính xác những gì tôi làm, nó là phiên bản đơn giản hóa của mã của tôi. Vâng bây giờ những điều kỳ lạ bắt đầu xảy ra: tất cả khởi tạo là tốt, không có lỗi trong OnInitDialog()
, nhưng khi tôi nhấp vào nút ... không có ngoại lệ được ném. Chẳng có gì xảy ra. Ở tất cả. Nếu tôi đặt điểm ngắt tại số *i = 3;
và nhấn F11, chức năng xử lý tạm dừng ngay lập tức và lấy nét được trả về ứng dụng, nó tiếp tục hoạt động tốt. Tôi có thể nhấp vào nút một lần nữa và điều tương tự sẽ xảy ra.
Có vẻ như ai đó đã xử lý xảy ra ngoại trừ vi phạm quyền truy cập và thực hiện trả lại âm thầm vào chu kỳ nhận tin nhắn ứng dụng chính.
Nếu tôi nhận xét dòng wglMakeCurrent(DC, hrc);
, tất cả hoạt động tốt như trước đây, ngoại lệ được ném và Visual Studio bắt nó và hiển thị cửa sổ có thông báo lỗi và chương trình phải được chấm dứt sau đó.
Tôi gặp sự cố này trong Windows 7 64 bit, NVIDIA GeForce 8800 với trình điều khiển mới nhất (trong 11,11/2010) có sẵn tại trang web được cài đặt. Đồng nghiệp của tôi có Windows Vista 32-bit và không có vấn đề như vậy - ngoại lệ được ném và ứng dụng bị treo trong cả hai trường hợp.
Vâng, hy vọng chàng trai tốt sẽ giúp tôi :)
PS Vấn đề ban đầu nơi đăng theo this chủ đề.
Thật buồn cười, tôi đã gặp vấn đề tương tự gần đây ... nếu bạn bọc mã ngoại lệ trong khối try-catch, nó sẽ bắt ngoại lệ có, nhưng nếu ngoại lệ lan truyền trong mã MFC nó dường như bị nuốt chửng. Tôi đoán một cách giải quyết tiềm năng là sử dụng các khối try-catch cho chính mình. – AshleysBrain
Tôi có thể xác nhận vấn đề này và nó đã làm với OpenGL trên windows vista 64 bit và cửa sổ 7 64 bit. Đang tìm kiếm câu trả lời cho bản thân mình :) – ralphtheninja
Điều này có vẻ tương tự như vấn đề của tôi: http://stackoverflow.com/questions/2622200/exceptions-silently-caught-by-windows-how-to-handle-manually –