我正在尝试将 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 的状态:
  • 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} tagPOINT
  • 最佳答案

    我刚刚修复了一个具有相同行为的问题。错误在于将参数传递给 SetWindowLongPtr(GWLP_WNDPROC),指向 WndProc 的指针被错误地转换为 LONG 而不是正确的 LONG_PTR。这样,指向 WndProc 的错误指针被放入内部操作系统 WND 结构中,因此对 HWND 的 WndProc 的任何后续调用都崩溃了。

    关于c++ - 64位MFC版本中的访问冲突异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5138156/

    10-11 20:38