일부 Windows 응용 프로그램 (레거시 코드)을 VC 6에서 VS2010으로 업그레이드하는 중입니다. 대부분의 응용 프로그램은 컴파일 된 것으로 예상되는 변환 오류를 정리 한 후에 실행되지만이 문제는 많은 문제가 있습니다. 여기서 LoadFrame()이 실패하고 응용 프로그램이 종료됩니다. 오류는 여기 반환 여기창 생성 실패 - LoadFrame (IDR_MAINFRAME)이 C++을 실패했습니다
CMainFrame* pMainFrame = new CMainFrame;// Create main MDI Frame window
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
DWORD err = GetLastError();
return FALSE;
0 위의 LoadFrame() 함수입니다 : (pParentWnd 및 pContext 함수 입력에 모두 널하고 내가 왜 이해하지?)
BOOL CMDIFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
CWnd* pParentWnd, CCreateContext* pContext)
{
if (!CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle,
pParentWnd, pContext))
return FALSE;
// save menu to use when no active MDI child window is present
ASSERT(m_hWnd != NULL);
m_hMenuDefault = ::GetMenu(m_hWnd);
return TRUE;
}
LoadFrame을 단계별로 실행하고 create 메소드를 검사 한 결과, 여기에 오류가 발생하는 곳이 있다는 것을 알았습니다. HWND hWnd = :: AfxCtxCreateWindowEx (..) cs.hwndParent와 cs.hMenu가 모두이 오류를 보여주고 있습니다. "unused = CXX0030 : 오류 : 표현식을 평가할 수 없습니다 ". 이 오류는 표현식이 프로그램 주소 공간 외부의 메모리를 참조한다는 것을 의미 할 수 있지만 문제는 아닌 것으로 봅니다. 이와 유사한 다른 문제를 온라인에서 보았지만 아무 것도 이해할 수 없었습니다. 문제.
BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{
ASSERT(lpszClassName == NULL || AfxIsValidString(lpszClassName) ||
AfxIsValidAtom(lpszClassName));
ENSURE_ARG(lpszWindowName == NULL || AfxIsValidString(lpszWindowName));
// allow modification of several common create parameters
CREATESTRUCT cs;
cs.dwExStyle = dwExStyle;
cs.lpszClass = lpszClassName;
cs.lpszName = lpszWindowName;
cs.style = dwStyle;
cs.x = x;
cs.y = y;
cs.cx = nWidth;
cs.cy = nHeight;
cs.hwndParent = hWndParent;
cs.hMenu = nIDorHMenu;
cs.hInstance = AfxGetInstanceHandle();
cs.lpCreateParams = lpParam;
if (!PreCreateWindow(cs))
{
PostNcDestroy();
return FALSE;
}
AfxHookWindowCreate(this);
HWND hWnd = ::AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass,
cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams); // RMC here's the error
GetLastError());
DWORD err = GetLastError();
#ifdef _DEBUG
if (hWnd == NULL)
{
TRACE(traceAppMsg, 0, "Warning: Window creation failed: GetLastError returns 0x%8.8X\n",
GetLastError());
}
문제는 상위 창과 컨텍스트가 널인 LoadFrame()에서 비롯된 것입니다. 왜 그들은 "null/???"입니까? (이 응용 프로그램은 VC 6에서 정상적으로 실행되므로 업그레이드 결과 여야합니다.) 누군가이 문제점을 보았거나 문제점에 대해 나에게 알려줄 수있는 정보가 있으면 매우 감사하게 생각합니다. 미리 감사드립니다.
올바르게 이해하면 내부 MFC 라이브러리 실패한 코드. 정말 이상합니다. 나의 첫 번째 생각은 환경에 잘못된 점이 있다는 것입니다. 마이그레이션하지 않고 * 새로운 * 응용 프로그램을 만들고 빌드 할 수 있습니까? –
VC6에서 VS2010으로 응용 프로그램을 업그레이드 한 후 내 인쇄 미리보기가 작동하지 않는데 어느 정도 비슷한 문제가있었습니다. 충돌이 발생합니다. MFC 인쇄 미리보기 내부가 충돌을 일으킨 것으로 변경되었음을 발견했습니다. 그 문제를 해결하기 위해 자신의 인쇄 미리보기 창을 열어야한다는 것을 기억하고 있으며, 나는 그 사실을 자랑스럽게 생각합니다. 그래서 내가 제안 할 것은 VS2010의 MFC'framework' 함수를 VC6의 MFC와 비교하여 무엇이 바뀌 었는지 알아 차리고 그에 따라 계획을 세우는 것입니다. – zar
'CMainFrame :: OnCreate()'에서 하위 구성 요소가 -1을 생성하고 반환하지 않는지 확인하십시오. – user1793036