我正在尝试将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:
答案 0 :(得分:9)
我刚刚解决了同一行为的问题。错误是将参数传递给SetWindowLongPtr(GWLP_WNDPROC),指向WndProc的指针未正确地转换为LONG而不是正确的LONG_PTR。这样,指向WndProc的错误指针被放入内部OS WND结构中,因此对HWND的WndProc的任何后续调用都会崩溃。
答案 1 :(得分:1)
看起来问题发生在MFC内部对DispatchMessage的调用中。如果您将参数发布到此调用中会很有帮助。
答案 2 :(得分:0)
好的,0x00000022是WM_CHILDACTIVATE mesasage。它不需要参数,所以它不会成为问题。想到的唯一其他可能原因是窗口标准无效。例如,包含它的DLL可能已被卸载,或者窗口可能已使用无效地址进行子类化。