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

Leo*_*eon 4 c++ 64-bit mfc visual-c++

我试图将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++
Run Code Online (Sandbox Code Playgroud)

注意请问为什么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));
}
Run Code Online (Sandbox Code Playgroud)

在这个阶段,pState的指针似乎是64位.

pState-> m_msgCu的状态:

  • pState-> m_msgCur {msg = 0x00000022 wp = 0x0000000000000000 lp = 0x0000000000000000} tagMSG
  • hwnd 0x0000000000020416 {unused = 0x00000000} HWND__*message 0x00000022 unsigned int wParam 0x0000000000000000 unsigned __int64 lParam 0x0000000000000000 __int64 time 0x000f3967 unsigned long
  • pt {x = 0x0000030f y = 0x00000356} tagPOINT

小智 9

我刚刚解决了同样行为的问题.错误是将参数传递给SetWindowLongPtr(GWLP_WNDPROC),指向WndProc的指针未正确地转换为LONG而不是正确的LONG_PTR.这样,指向WndProc的错误指针被放入内部OS WND结构中,因此对HWND的WndProc的任何后续调用都会崩溃.