GetMessage()破坏我的堆栈?

时间:2015-09-06 13:27:09

标签: c++ winapi visual-studio-2015

多年来,我已经在各种不同的程序中使用了以下功能。它一直工作没有错误。直到现在,这是我第一次试图让它以64位代码为目标。

我尝试逐行逐步执行代码...首先,我执行行something_done = TRUE;,它显然将something_done设置为1 ...我在“监视”窗口中监视。然后我执行GetMessage (&msg, NULL, 0, 0); ...但不知何故,在执行过程中,变量something_done被设置为零!随后代码突然退出循环,并且在从函数调用返回时,编译器报告“运行时检查失败#2 - 变量'msg'周围的堆栈已损坏。”

我不确定从哪里开始。

void process_messages_until_idle()
{
    MSG msg;
    int something_done;
    int temp;

    for (;;)
    {
        something_done = FALSE;

        temp = PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);

        if (temp)
        {
            something_done = TRUE;
            GetMessage (&msg, NULL, 0, 0);
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }

        if (!something_done)
        {
            break;
        }
    }
}

更新:我将something_done更改为static,现在程序完全在其他地方崩溃 - 在一个更有意义的地方,所以这可能更容易调试。

3 个答案:

答案 0 :(得分:1)

虽然您在执行PeekMessage时有消息,但某些内容可能已更改。

if (GetMessage(&msg, NULL, 0, 0) > 0) {
        something_done = TRUE;
        TranslateMessage (&msg);
        DispatchMessage (&msg);
}

答案 1 :(得分:1)

我在项目的x64转换时遇到此错误。原来我们的项目中有/ Zp1结构成员对齐,这就是将MSG结构的大小从48个字节改为40,然后在x64上导致堆栈损坏(可能还有其他未实现的问题)。在Win32下它工作得很好。

答案 2 :(得分:0)

你正在某处破坏你的筹码。检查堆栈损坏时您正在处理的消息,并检查其代码以查看它是如何中断的。