PeekMessage () создает необработанное исключение (нарушение прав доступа) - PullRequest
2 голосов
/ 16 сентября 2010

Привет всем,

в моем приложении я использую следующий код:

bool HandleMessages()
{
MSG msg;

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
    if (msg.message == WM_QUIT)
        return FALSE;

    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

return true;
}

Это стандартный код для обработки сообщений в Windows, я думал, но теперь, когда я пытаюсь запустить программу, я всегда получаю Исключение при вызове PeekMessage ().

Сообщение об исключении:

Необработанное исключение в 0x57a10eed (msvcr100d.dll) в testing.exe: 0xC0000005: нарушение доступа при чтение в позиции 0x6666665c.

Я полностью потерян здесь, не могу понять, почему это вызвало бы исключение. Кто-нибудь получил подсказку?

стек вызовов:

msvcr100d.dll! __ local_unwind2 () + 0x48 байт Asm

msvcr100d.dll! _Except_handler3 () + 0xed байтов Asm

Testing.exe! _Except_handler4 (_EXCEPTION_RECORD * ExceptionRecord, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame, _CONTEXT * ContextRecord, void * DispatcherContext) + 0x24 байта C

Testing.exe! _Except_handler4 (_EXCEPTION_RECORD * ExceptionRecord, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame, _CONTEXT * ContextRecord, void * DispatcherContext) + 0x24 байта C

Демонтажные:

продолжение

57CE0EEA lea esi, [esi + esi * 2]
57CE0EED mov ecx, dword ptr [ebx + esi * 4]
57CE0EF0 mov dword ptr [esp + 0Ch], ecx
57CE0EF4 mov dword ptr [eax + 0Ch], ecx
57CE0EF7 cmp dword ptr [ebx + esi * 4 + 4], 0
57CE0EFC jne _lu_continue (57CE0F15h)
57CE0EFE push 101h
57CE0F03 mov eax, dword ptr [ebx + esi * 4 + 8]
57CE0F07 вызов _NLG_Notify (57CE0F55h)
57CE0F0C mov eax, dword ptr [ebx + esi * 4 + 8]
57CE0F10 вызов _NLG_Call (57CE0F74h)

Ответы [ 2 ]

0 голосов
/ 23 ноября 2010

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

Есть ли вероятность, что вы могли бы вызывать HandleMessages () в ответ на сообщение? Это может привести к рекурсии / исчерпанию стека.

0 голосов
/ 16 сентября 2010
  • Покажите нам свой стек вызовов.Если происходит сбой в msvcr100d.dll, то это происходит за пределами PeekMessage (до или после вызова).у вас должна быть хорошая отладочная информация для этого.
  • Взгляните на указатель this, если применимо
  • выполните перестройку всех
  • Шаг в разборку
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...