Я нахожусь в середине обновления некоторых приложений 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, поэтому оно должно быть результатом обновления). Если кто-то видел эту проблему или имел какую-либо информацию, которая могла бы рассказать мне об этой проблеме, я был бы чрезвычайно благодарен. Заранее спасибо.
Если я правильно понимаю, вы говорите, что это внутренняя библиотека MFC код, который не работает. Это действительно странно. Моя первая мысль заключается в том, что в вашей среде что-то плохое. Можете ли вы создать и создать приложение * new *, не перенося что-нибудь? –
У меня была несколько схожая проблема, когда мой предварительный просмотр печати не будет работать после обновления приложения от VC6 до VS2010, и он сработает. Я обнаружил, что внутренняя часть предварительного просмотра MFC изменилась, что вызвало крах. Я помню, что мне пришлось управлять собственным окном предварительного просмотра, чтобы исправить эту проблему, и я был очень горд этим. Поэтому я бы предложил сравнить функции «framework» MFC «VS2010» с VC6 и заметить, что изменилось и спланировано соответствующим образом. – zar
Посмотрите в 'CMainFrame :: OnCreate()', чтобы увидеть, не создает ли какой-либо подкомпонент создание и возврат -1. – user1793036