Ho un'applicazione basata su finestra di dialogo basata su MFC creata con MSVS2005. Ecco il mio problema passo dopo passo. Ho pulsante sulla mia finestra e corrispondente click-handler con codice come questo:OpenGL sopprime le eccezioni nell'applicazione basata su finestra di dialogo MFC
int* i = 0;
*i = 3;
Io corro versione di debug del programma e quando clicco sul pulsante, Visual Studio catture fuoco e avvisi "posizione di scrittura Violazione di accesso "Eccezione, il programma non può recuperare dall'errore e tutto ciò che posso fare è fermare il debug. E questo è il comportamento giusto.
Ora aggiungo un po 'di codice di inizializzazione OpenGL nel metodo 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);
Naturalmente questo non è esattamente quello che faccio, è la versione semplificata del mio codice. Bene, ora le cose strane cominciano a succedere: tutte le inizializzazioni vanno bene, non ci sono errori in OnInitDialog()
, ma quando clicco sul pulsante ... non viene lanciata alcuna eccezione. Non accade nulla. Affatto. Se si imposta un punto di interruzione su *i = 3;
e si preme F11 su di esso, la funzione di gestione si arresta immediatamente e il focus viene restituito all'applicazione, che continua a funzionare correttamente. Posso fare nuovamente clic sul pulsante e succederà la stessa cosa.
Sembra che qualcuno abbia gestito un'eccezione di violazione di accesso e ha restituito silenziosamente l'esecuzione al ciclo di ricezione dei messaggi dell'applicazione principale.
Se commento la riga wglMakeCurrent(DC, hrc);
, tutto funziona come prima, viene generata un'eccezione e Visual Studio lo rileva e mostra la finestra con messaggio di errore e il programma deve essere terminato in seguito.
Ho riscontrato questo problema in Windows 7 64-bit, NVIDIA GeForce 8800 con i driver più recenti (dell'11.01.2010) disponibili sul sito Web installato. Il mio collega ha Windows Vista a 32 bit e non ha problemi di questo tipo - viene generata un'eccezione e l'applicazione si blocca in entrambi i casi.
Beh, spero bravi ragazzi mi aiuteranno :)
PS Il problema in origine in cui è esposto sotto this argomento.
Questo è divertente, ho avuto lo stesso problema di recente ... se si esegue il wrapping del codice di eccezioni in un blocco try-catch, verrà rilevata l'eccezione lì, ma se l'eccezione si propaga nel codice MFC sembra essere ingoiata. Immagino che una soluzione potenziale sia quella di usare i blocchi try-catch da soli. – AshleysBrain
Posso confermare questo problema e ha a che fare con OpenGL su Windows Vista 64 bit e Windows 7 64 bit. Cercando la risposta da solo :) – ralphtheninja
Questo sembra simile al mio problema: http://stackoverflow.com/questions/2622200/exceptions-silently-caught-by-windows-how-to-handle-manually –