【问题标题】:Visual Studio 2017 MFC SDI Debug Assertion OnCreateVisual Studio 2017 MFC SDI 调试断言 OnCreate
【发布时间】:2018-03-06 06:34:41
【问题描述】:

我想用 Visual Studio 2017 创建一个 MFC 单文档应用程序。

我在创建新项目时做了以下配置:

如果我现在构建并运行新创建的项目而不对代码进行任何更改,它会立即崩溃并显示Debug Assertion Error。 这是我收到的消息:

看来问题出在MainFrame.cppOnCreate 方法中。 该函数将带有NULLpContext 变量提供给m_wndSplitter.Create 函数。

这是MainFrame 类的OnCreateOnCreateClient 函数:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    BOOL bNameValid;

    // create a view to occupy the client area of the frame
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
        TRACE0("Failed to create view window\n");
        return -1;
    }

    m_wndRibbonBar.Create(this);
    m_wndRibbonBar.LoadFromResource(IDR_RIBBON);

    if (!m_wndStatusBar.Create(this))
    {
        TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
    }

    CString strTitlePane1;
    CString strTitlePane2;
    bNameValid = strTitlePane1.LoadString(IDS_STATUS_PANE1);
    ASSERT(bNameValid);
    bNameValid = strTitlePane2.LoadString(IDS_STATUS_PANE2);
    ASSERT(bNameValid);
    m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE1, strTitlePane1, TRUE), strTitlePane1);
    m_wndStatusBar.AddExtendedElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE2, strTitlePane2, TRUE), strTitlePane2);

    // enable Visual Studio 2005 style docking window behavior
    CDockingManager::SetDockingMode(DT_SMART);
    // enable Visual Studio 2005 style docking window auto-hide behavior
    EnableAutoHidePanes(CBRS_ALIGN_ANY);

    return 0;
}


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
{
    return m_wndSplitter.Create(this,
        2, 2,               // TODO: adjust the number of rows, columns
        CSize(10, 10),      // TODO: adjust the minimum pane size
        pContext);
}

【问题讨论】:

  • “按重试调试应用程序” - 你为什么不呢?这会将您直接带到失败的调试断言,为您提供有价值的上下文来分析您遇到的问题。您还需要摒弃常见的误解:失败的调试断言对话框与应用程序崩溃不同。
  • 那个,还可以查看调用堆栈,它可以为您提供更多上下文信息。特别是如果断言发生在 MFC 代码的深处,您将能够看到调用源自您的应用程序代码的位置。
  • 它源自if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) 我为该函数调用设置了一个断点,但如果我想尝试对其进行调试,它会直接抛出调试断言。我还按下了重试,这让我进入了断言为假的CSplitterWnd::Create(...) 方法。调用函数将 null 传递给 pContext 的此函数,但由于第一个提到的 OnCreate 函数的问题,我无法找到 pContext 获取 null 的位置。

标签: mfc splitter sdi


【解决方案1】:

我解决了问题。 发生断言是因为需要文档/视图架构。 如果我添加了文档/视图架构,程序运行没有任何问题

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多