多年来,我已经在各种不同的程序中使用了以下功能。它一直工作没有错误。直到现在,这是我第一次试图让它以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
,现在程序完全在其他地方崩溃 - 在一个更有意义的地方,所以这可能更容易调试。
答案 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)
你正在某处破坏你的筹码。检查堆栈损坏时您正在处理的消息,并检查其代码以查看它是如何中断的。