2014-04-18 11 views
0

일부 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에서 정상적으로 실행되므로 업그레이드 결과 여야합니다.) 누군가이 문제점을 보았거나 문제점에 대해 나에게 알려줄 수있는 정보가 있으면 매우 감사하게 생각합니다. 미리 감사드립니다.

+0

올바르게 이해하면 내부 MFC 라이브러리 실패한 코드. 정말 이상합니다. 나의 첫 번째 생각은 환경에 잘못된 점이 있다는 것입니다. 마이그레이션하지 않고 * 새로운 * 응용 프로그램을 만들고 빌드 할 수 있습니까? –

+0

VC6에서 VS2010으로 응용 프로그램을 업그레이드 한 후 내 인쇄 미리보기가 작동하지 않는데 어느 정도 비슷한 문제가있었습니다. 충돌이 발생합니다. MFC 인쇄 미리보기 내부가 충돌을 일으킨 것으로 변경되었음을 발견했습니다. 그 문제를 해결하기 위해 자신의 인쇄 미리보기 창을 열어야한다는 것을 기억하고 있으며, 나는 그 사실을 자랑스럽게 생각합니다. 그래서 내가 제안 할 것은 VS2010의 MFC'framework' 함수를 VC6의 MFC와 비교하여 무엇이 바뀌 었는지 알아 차리고 그에 따라 계획을 세우는 것입니다. – zar

+0

'CMainFrame :: OnCreate()'에서 하위 구성 요소가 -1을 생성하고 반환하지 않는지 확인하십시오. – user1793036

답변

0

내 라이브러리 경로 (링커 -> 추가 종속성)에는 MDI (Multiple-Document Interface)에 반대되는 SDI (단일 문서 인터페이스)를 지원하는 라이브러리가 포함되어 있습니다. 그뿐만 아니라 MDI 라이브러리는 Visual Studio 2010에서 사용되는 새로운 MDI 메서드를 지원하지 않는 이전 버전 (VC6)이었습니다.