我有一個使用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