我正在尝试将 32 位应用程序移植到 64 位。计算似乎运行正确,但我无法正确配置 View 。我在 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 位指针,但我无法指出发生这种情况的地方。我从微软加载了调试符号,它显示了调用堆栈的顶部。
非常感谢任何帮助。
莱昂
编辑
调用 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 的状态:
消息 0x00000022 无符号整数
wParam 0x0000000000000000 无符号 __int64
lParam 0x0000000000000000 __int64
时间 0x000f3967 无符号长
最佳答案
我刚刚修复了一个具有相同行为的问题。错误在于将参数传递给 SetWindowLongPtr(GWLP_WNDPROC),指向 WndProc 的指针被错误地转换为 LONG 而不是正确的 LONG_PTR。这样,指向 WndProc 的错误指针被放入内部操作系统 WND 结构中,因此对 HWND 的 WndProc 的任何后续调用都崩溃了。
关于c++ - 64位MFC版本中的访问冲突异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5138156/