【问题标题】:Window creation failed - LoadFrame(IDR_MAINFRAME) Fails C++窗口创建失败 - LoadFrame(IDR_MAINFRAME) 失败 C++
【发布时间】:2014-06-03 03:51:40
【问题描述】:

我正在将一些 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 在进入函数时都是 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 库代码。这真的很奇怪。我的第一个想法是你的环境有严重问题。您能否在不迁移任何内容的情况下创建和构建一个应用程序?
  • 前段时间我遇到了一些类似的问题,在将应用程序从 VC6 升级到 VS2010 后,我的打印预览无法正常工作,并且会崩溃。我发现 MFC 打印预览的内部发生了变化,这导致了崩溃。我记得我必须驱动自己的打印预览窗口来解决这个问题,我为此感到非常自豪。所以我的建议是将VS2010的MFCframeworkfunctions与VC6的函数进行比较,并注意发生了什么变化并做出相应的计划。
  • 查看CMainFrame::OnCreate() 看看是否有任何子组件创建失败并返回-1。
  • @CodyGray 是的,它似乎是内部 MFC。我也是这么想的,但是我可以毫无问题地创建和构建一个新的应用程序吗?这个程序依赖于一个 .dll,这会对窗口的创建产生影响吗?
  • 是 SDI 还是 MDI?您还应该注意在 VS2010 中每个 MDI 在新窗口中打开的事实,而不是在 VC6 中的 MDI。

标签: c++ winapi mfc porting visual-c++-6


【解决方案1】:

事实证明,我的库路径(链接器 -> 附加依赖项)包含一个支持 SDI(单文档接口)而不是 MDI(多文档接口)的库。此外,MDI 库是旧版本 (VC6),不支持 Visual Studio 2010 中使用的新 MDI 方法。

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多