нарушение прав доступа в WM_PAINT, не пойманном

Если у Вас есть 5-10 строк кода, который может безопасно быть помещен в блок как этот, тот же код мог точно также быть извлечен в метод.

Это могло бы казаться, что это - только семантическое различие, но по крайней мере с извлечением в метод тогда Вы получили бы выгоду от способности повторного использования.

7
задан sth 22 July 2010 в 19:47
поделиться

6 ответов

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;
}
5
ответ дан 6 December 2019 в 19:39
поделиться

Исключение будет выдано в WinXP и Vista. Я только что протестировал это в Vista в конфигурациях отладки и выпуска. У вас есть такая же проблема в новом проекте приложения Win32?

0
ответ дан 6 December 2019 в 19:39
поделиться

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.

0
ответ дан 6 December 2019 в 19:39
поделиться

DispatchMessage, похоже, теперь содержит блок перехвата попыток SEH, который запрещает исключения, генерируемые процессами окна.

Вы все еще можете перехватывать эти исключения в отладчике - в зависимости от версии вашей Visual Studio вам нужно откройте диалоговое окно «Отладка-> исключения» и отметьте столбец «Прерывание при возникновении исключения» для всех исключений Win32 или, по крайней мере, исключения 0xc0000005

3
ответ дан 6 December 2019 в 19:39
поделиться

Начиная с XP, можно использовать функциональность обработки векторных исключений. Она имеет приоритет над всеми другими видами исключений. В моем примере она правильно поймала нарушение доступа в сообщении WM_PAINT. К сожалению, она также отлавливает все другие виды исключений, которые я, вероятно, должен решить, проверив код исключения.

0
ответ дан 6 December 2019 в 19:39
поделиться

Это известный дефект. Проверьте исправление. http://support.microsoft.com/kb/976038

5
ответ дан 6 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: