Утверждение отладки SDI Visual Studio 2017 MFC при создании

Я хочу создать однодокументное приложение MFC с помощью Visual Studio 2017.

Я сделал следующую конфигурацию при создании нового проекта:

Конфигурация MFC SD

Конфигурация MFC SD

Конфигурация MFC SD

Конфигурация MFC SD

Если я сейчас соберу и запущу только что созданный проект без каких-либо изменений в коде, он немедленно выйдет из строя с ошибкой Debug Assertion Error. Это сообщение, которое я получил:

введите здесь описание изображения

Кажется, проблема внутри метода OnCreate метода MainFrame.cpp. Функция передает переменную pContext с NULL функции m_wndSplitter.Create.

Это OnCreate и OnCreateClient функция класса MainFrame:

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);
}

person Kevin    schedule 06.03.2018    source источник
comment
Нажмите "Повторить" для отладки приложения. Почему вы этого не сделали? Это приведет вас прямо к ошибочному утверждению отладки, что даст вам ценный контекст для анализа проблемы, с которой вы столкнулись. Вам также необходимо отказаться от распространенного заблуждения: неудачное диалоговое окно подтверждения отладки — это не то же самое, что сбой приложения.   -  person IInspectable    schedule 06.03.2018
comment
Это, а также взгляните на стек вызовов, который дает вам еще больше контекстной информации. Особенно, если утверждение происходит глубоко в коде MFC, вы сможете увидеть, откуда исходит вызов из кода вашего приложения.   -  person zett42    schedule 06.03.2018
comment
Это происходит из if (CFrameWndEx::OnCreate(lpCreateStruct) == -1), я установил точку останова для этого вызова функции, но если я хочу попытаться выполнить отладку, он напрямую выдает утверждение отладки. Я также нажал повторную попытку, и это приводит меня к методу CSplitterWnd::Create(...), где утверждение ложно. Вызывающая функция передает значение null этой функции для pContext, но я не смог найти, где pContext получает значение null из-за первой упомянутой проблемы с функцией OnCreate.   -  person Kevin    schedule 06.03.2018


Ответы (1)


Я решил проблему. Утверждение происходит потому, что необходима архитектура документа/представления. Если я добавил архитектуру документа/представления, программа запускается без проблем.

person Kevin    schedule 26.09.2018