在我的应用程序中,我使用以下代码:
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 字节汇编
msvcr100d.dll!_ except_handler3() + 0xed 字节 Asm
Testing.exe!_except_handler4(_EXCEPTION_RECORD * ExceptionRecord, _EXCEPTION_REGISTRATION_RECORD * ImplementerFrame, _CONTEXT * ContextRecord, void * DispatcherContext) + 0x24 字节 C
Testing.exe!_except_handler4(_EXCEPTION_RECORD * ExceptionRecord, _EXCEPTION_REGISTRATION_RECORD * ImplementerFrame, _CONTEXT * ContextRecord, void * DispatcherContext) + 0x24 字节 C
拆解:
继续:
57CE0EEA lea esi,[esi+esi2]
57CE0EED mov ecx,dword ptr [ebx+esi4]
57CE0EF0 mov dword ptr [esp+0Ch],ecx
57CE0EF4 mov 双字指针 [eax+0Ch],ecx
57CE0EF7 cmp 双字指针 [ebx+esi4+4],0
57CE0EFC jne _lu_继续(57CE0F15h)
57CE0EFE推101h
57CE0F03 mov eax,dword ptr [ebx+esi4+8]
57CE0F07 调用_NLG_Notify (57CE0F55h)
57CE0F0C mov eax,dword ptr [ebx+esi*4+8]
57CE0F10 调用_NLG_Call (57CE0F74h)
msvcr100d.dll
内崩溃,则它发生在 PeekMessage
之外(调用之前或之后)。你应该有很好的调试信息。this
指针(如果适用)我认为您发布的调用堆栈不足以从中得出任何结论。
您是否有可能调用 HandleMessages() 来响应消息?这可能会导致递归/堆栈耗尽。