64位MFC版本中的访问冲突异常

时间:2011-02-28 04:23:03

标签: c++ visual-c++ mfc 64-bit

我正在尝试将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 {unused = 0x00000000} HWND__ *     消息0x00000022 unsigned int     wParam 0x0000000000000000 unsigned __int64     lParam 0x0000000000000000 __int64     时间0x000f3967无符号长
  • pt {x = 0x0000030f y = 0x00000356} tagPOINT

3 个答案:

答案 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可能已被卸载,或者窗口可能已使用无效地址进行子类化。