窗口创建失败 - LoadFrame(IDR_MAINFRAME)失败C ++

时间:2014-04-18 15:42:52

标签: c++ winapi mfc porting vc6

我正在将一些Windows应用程序(旧版代码)从VC 6升级到VS2010。大多数应用程序已编译并在清理预期的转换错误后运行,但我遇到了很多麻烦。这是LoadFrame()失败并退出应用程序的地方。此处返回的错误为0。

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

以上是上面的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中正常运行,因此必须是升级的结果)如果有人看到此问题或有任何可能启发我的问题的信息,我将非常感激。在此先感谢。

1 个答案:

答案 0 :(得分:0)

事实证明,我的库路径(Linker - > Additional Dependencies)包含一个支持与MDI(多文档接口)相对的SDI(单文档接口)的库。除此之外,MDI库是旧版本(VC6),它不支持Visual Studio 2010中使用的新MDI方法。