【发布时间】:2018-03-06 06:34:41
【问题描述】:
我想用 Visual Studio 2017 创建一个 MFC 单文档应用程序。
我在创建新项目时做了以下配置:
如果我现在构建并运行新创建的项目而不对代码进行任何更改,它会立即崩溃并显示Debug Assertion Error。
这是我收到的消息:
看来问题出在MainFrame.cpp 的OnCreate 方法中。
该函数将带有NULL 的pContext 变量提供给m_wndSplitter.Create 函数。
这是MainFrame 类的OnCreate 和OnCreateClient 函数:
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 的位置。