Исключение нарушения прав доступа в 64-битной версии MFC - PullRequest
4 голосов
/ 28 февраля 2011

Я пытаюсь перенести 32-битное приложение на 64-битное.Похоже, что вычисления выполняются правильно, но я не могу правильно настроить представления.Я использую MFC, C ++ и OpenGL, компилятор Intel 10.0.027 внутри VS2005 на машине W7 x64.

Когда происходит сбой, я получаю следующее сообщение: «Исключение первого шанса в 0xffffffff8043b1b6 в 3DApp.exe: 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++

NOTE PLEASE почему вызывается UserCallWinProcCheckWow, я думал, что суффикс Wow был только для эмуляции 32-битных приложений на64-разрядный компьютер

Очевидно, что где-то 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} тэг MSG
  • h0000000000000000000000* сообщение 0x00000022 без знака int wParam 0x0000000000000000 без знака __int64 lParam 0x0000000000000000 __int64 время 0x000f3967 без знака long
  • pt {x = 0x0000030f y = 0x00000356} tagPOINT

Ответы [ 3 ]

9 голосов
/ 02 июня 2011

Я только что исправил проблему с таким же поведением. Ошибка была в передаче параметров в SetWindowLongPtr (GWLP_WNDPROC), указатель на WndProc был неправильно приведен к LONG вместо правильного LONG_PTR. Таким образом, неверный указатель на WndProc был помещен во внутреннюю структуру WND ОС, поэтому любой последующий вызов WndProc HWND завершился сбоем.

1 голос
/ 28 февраля 2011

Похоже, что проблема возникает при вызове DispatchMessage внутри MFC. Было бы полезно, если бы вы опубликовали параметры для этого вызова.

0 голосов
/ 28 февраля 2011

ОК, 0x00000022 - это сообщение WM_CHILDACTIVATE .Он не принимает параметров, поэтому с ними проблем быть не может.Единственная другая возможная причина, которая приходит на ум, заключается в том, что процедура окна недействительна.Например, содержащая ее библиотека DLL может быть выгружена или окно может быть разделено на подклассы с неверным адресом.

...