【发布时间】:2011-07-05 12:30:03
【问题描述】:
我正在尝试将 32 位应用程序移植到 64 位。计算似乎运行正确,但我无法正确配置视图。我在 W7 x64 机器上的 VS2005 中使用 MFC、C++ 和 OpenGL、Intel 10.0.027 编译器。
当崩溃发生时,我收到以下消息:“3DApp.exe 中 0xffffffff8043b1b6 的第一次机会异常:0xC0000005:位置 0xffffffff8043b1b6 的访问冲突”,这是堆栈跟踪:
ffffffff8043b1b6()
user32.dll!UserCallWinProcCheckWow() + 0x11d bytes
user32.dll!DispatchMessageWorker() + 0x12a bytes
3DApp.exe!AfxInternalPumpMessage() Line 183 C++
3DApp.exe!CWinThread::PumpMessage() Line 896 C++
3DApp.exe!CWinThread::Run() Line 625 + 0x13 bytes C++
请注意为什么要调用 UserCallWinProcCheckWow,我认为 Wow 后缀仅用于在 64 位计算机上模拟 32 位应用程序
显然,在某处 64 位指针被视为 32 位指针,但我无法指出发生这种情况的位置。我从 microsoft 加载了调试符号,它显示了调用堆栈的顶部。
非常感谢任何帮助。 里昂
编辑
调用DispatchMessage的代码是:
if (pState->m_msgCur.message != WM_KICKIDLE && !AfxPreTranslateMessage(&(pState->m_msgCur)))
{
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
}
在这个阶段 pState 的指针似乎是 64 位的。
pState 的状态->m_msgCu:
- pState->m_msgCur {msg=0x00000022 wp=0x0000000000000000 lp=0x0000000000000000} tagMSG
- hwnd 0x0000000000020416 {未使用=0x00000000 } HWND__ * 消息 0x00000022 无符号整数 wParam 0x0000000000000000 无符号 __int64 lParam 0x0000000000000000 __int64 时间 0x000f3967 无符号长
- pt {x=0x0000030f y=0x00000356} 标签点
【问题讨论】:
标签: c++ visual-c++ mfc 64-bit