2014-04-18 1 views
0

Я нахожусь в середине обновления некоторых приложений Windows (Legacy Code) от VC 6 до VS2010. Большинство приложений скомпилированы и будут запускаться после очистки ожидаемых ошибок преобразования, но у меня с этим много проблем. Здесь loadFrame() терпит неудачу, и приложение завершает работу. вернулся сюда ошибка 0.Не удалось создать окно - LoadFrame (IDR_MAINFRAME) Fails C++

 CMainFrame* pMainFrame = new CMainFrame;// Create main MDI Frame window 
    if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) 
     DWORD err = GetLastError(); 
    return FALSE; 

Вот функция LoadFrame() сверху: (pParentWnd и pContext оба Null на входе в функцию, и я не понимаю, почему?)

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 показывают эту ошибку «неиспользуемые = 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 код, который не работает. Это действительно странно. Моя первая мысль заключается в том, что в вашей среде что-то плохое. Можете ли вы создать и создать приложение * new *, не перенося что-нибудь? –

+0

У меня была несколько схожая проблема, когда мой предварительный просмотр печати не будет работать после обновления приложения от VC6 до VS2010, и он сработает. Я обнаружил, что внутренняя часть предварительного просмотра MFC изменилась, что вызвало крах. Я помню, что мне пришлось управлять собственным окном предварительного просмотра, чтобы исправить эту проблему, и я был очень горд этим. Поэтому я бы предложил сравнить функции «framework» MFC «VS2010» с VC6 и заметить, что изменилось и спланировано соответствующим образом. – zar

+0

Посмотрите в 'CMainFrame :: OnCreate()', чтобы увидеть, не создает ли какой-либо подкомпонент создание и возврат -1. – user1793036

ответ

0

Оказалось, что мой путь к библиотеке (Linker -> Additional Dependencies) содержит библиотеку, которая поддерживает интерфейс SDI (Single Document Document), противоположный MDI (интерфейс нескольких документов). Кроме того, библиотека для MDI была более старой версией (VC6), которая не поддерживала новые методы MDI, которые используются в Visual Studio 2010.

Смежные вопросы