【发布时间】:2011-04-12 22:16:38
【问题描述】:
大家好,
在我的应用程序中,我使用以下代码:
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 Bytes 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 推 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)
【问题讨论】:
-
你确定这是完整和实际的代码吗?
-
是的,这就是 VS2010 调试器停止并显示异常的地方
-
那么你是在一个好的对象实例上调用 HandleMessages() 吗?
-
离题,但请不要混淆
BOOL和bool。 -
你的 "if (PeekMessage..." 应该是 "while (PeekMessage..." 否则发布的消息将排队并且可能溢出消息队列,这可能非常糟糕。 -- 至少,我假设您没有充分的理由发送所有已发送的消息和至多一条已发布的消息。在这种情况下,您通常希望处理所有排队的消息或不处理任何消息; 几乎永远不会你只想处理第一个而留下其他的。