Если у Вас есть 5-10 строк кода, который может безопасно быть помещен в блок как этот, тот же код мог точно также быть извлечен в метод.
Это могло бы казаться, что это - только семантическое различие, но по крайней мере с извлечением в метод тогда Вы получили бы выгоду от способности повторного использования.
As a workaround I remove all registered exception handlers in my window procedure. Quite ugly.
LRESULT CALLBACK window_proc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // get thread information block NT_TIB* tib; __asm { mov EAX, FS:[18h] mov [tib], EAX } // old exception handler list _EXCEPTION_REGISTRATION_RECORD* old_exception_handler = tib->ExceptionList; // remove all exception handler with exception of the default handler while( tib->ExceptionList->Next != (_EXCEPTION_REGISTRATION_RECORD*)-1 ) { tib->ExceptionList = tib->ExceptionList->Next; } LRESULT result = DefWindowProc( hwnd, uMsg, wParam, lParam ); // restore old exception handler tib->ExceptionList = old_exception_handler; return result; }
Исключение будет выдано в WinXP и Vista. Я только что протестировал это в Vista в конфигурациях отладки и выпуска. У вас есть такая же проблема в новом проекте приложения Win32?
I've noticed that, when you have Aero enabled (which is by default in Vista), resizing windows tends to create many, many page faults. These aren't normal virtual memory-needs-to-be-paged-in faults, either. I suspect (though it's just a theory), that Aero redirects the graphics output to a protected chunk of memory, and catches the faults in order to know which bits of the visible surface need to be recomposited on the desktop. Perhaps that is eating other access violations as well.
DispatchMessage, похоже, теперь содержит блок перехвата попыток SEH, который запрещает исключения, генерируемые процессами окна.
Вы все еще можете перехватывать эти исключения в отладчике - в зависимости от версии вашей Visual Studio вам нужно откройте диалоговое окно «Отладка-> исключения» и отметьте столбец «Прерывание при возникновении исключения» для всех исключений Win32 или, по крайней мере, исключения 0xc0000005
Начиная с XP, можно использовать функциональность обработки векторных исключений. Она имеет приоритет над всеми другими видами исключений. В моем примере она правильно поймала нарушение доступа в сообщении WM_PAINT. К сожалению, она также отлавливает все другие виды исключений, которые я, вероятно, должен решить, проверив код исключения.
Это известный дефект. Проверьте исправление. http://support.microsoft.com/kb/976038