PeekMessage() 抛出未处理的异常(访问冲突)

Posted

技术标签:

【中文标题】PeekMessage() 抛出未处理的异常(访问冲突)【英文标题】:PeekMessage() throws an unhandled exception (access violation) 【发布时间】: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() 吗? 离题,但请不要混淆BOOLbool 你的 "if (PeekMessage..." 应该是 "while (PeekMessage..." 否则发布的消息将排队并且可能溢出消息队列,这可能非常糟糕。 -- 至少,我假设您没有充分的理由发送所有已发送的消息和至多一条已发布的消息。在这种情况下,您通常希望处理所有排队的消息或不处理任何消息; 几乎永远不会你只想处理第一个而留下其他的。 【参考方案1】: 向我们展示您的调用堆栈。如果它在msvcr100d.dll 中崩溃,那么它发生在PeekMessage 之外(在通话之前或之后)。你应该有很好的调试信息。 查看this 指针(如果适用) 全部重建 进入拆解阶段

【讨论】:

【参考方案2】:

我认为您发布的调用堆栈不足以从中得出任何结论。

您是否有可能调用 HandleMessages() 来响应消息?这可能会导致递归/堆栈耗尽。

【讨论】:

不过,堆栈溢出不会导致访问冲突。除此之外,指针 (0x6666665c) 看起来非常非随机,几乎就像有人注入了某种魔法值。 @IInspectable:你有时间机器什么的吗? 为什么需要这样做? 只是想知道你为什么要评论我近 8 年前发布的答案:) 年龄不会影响知名度。任何来到这个网站的人仍然可以看到这个答案,我觉得它与问题不符。我将 cmets 留在 8 年前的贡献上,原因与我将 cmets 留在可能更早的文档上的原因相同:要求澄清公开可见的内容。

以上是关于PeekMessage() 抛出未处理的异常(访问冲突)的主要内容,如果未能解决你的问题,请参考以下文章

抛出未处理的异常:写访问冲突。 bunnies_array 是 0x5CB3CBA

C++ Battle4Zion 项目抛出未处理的异常:读取访问冲突。 **this** 是 nullptr。发生了

在 TPL 中快速抛出未处理的异常

Xcode升级后iOS项目抛出未处理的异常

Visual C ++ - 从设置表单图标中抛出未处理的异常?

Visual Studio 2019 c++latest random_device uniform_int_distribution 抛出未处理的异常