Обновление MFC проекта с VS2010 на VS2015
От: RainBoy  
Дата: 26.09.18 05:46
Оценка:
Добрый день.

Есть x64 Single Document MFC проект, который спокойно собирается и работает, скомпилированный в VS2010 (Platform Toolset v100)
Возникла необходиость собирать проект под VS2015, соответственно Platform Toolset теперь v140
Проект собирается, но крашится при запуске. Дебаг показал, что крашится, начиная с этого участка:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

   if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) // Here
      return -1;


Я создал пустой MFC проект, чтобы понять, что изменилось. Был добавлен следующий код

BOOL CProblemApp::InitInstance()
{


    // InitCommonControlsEx() is required on Windows XP if an application
    // manifest specifies use of ComCtl32.dll version 6 or later to enable
    // visual styles.  Otherwise, any window creation will fail.
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // Set this to include all the common control classes you want to use
    // in your application.
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();


    // Initialize OLE libraries
    if (!AfxOleInit())
    {
        AfxMessageBox(IDP_OLE_INIT_FAILED);
        return FALSE;
    }

    AfxEnableControlContainer();


Ничего не изменилось. Использовать VS2010 крайне проблематично, установить SDK 7.1 на Windows 10 в полном объеме у меня не вышло.
Если у кого-то были позожие глюки при обновлении, буду рад услышать мнения и советы.

Спасибо!
Re: Обновление MFC проекта с VS2010 на VS2015
От: RainBoy  
Дата: 26.09.18 06:11
Оценка:
Небольшое дополнение

CProblemView::CProblemView()
{
    CProblemDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);


Вылетает в Assert и в моем и в сгенерированном VS2015 приложении. pDoc используется в конструкторе, но не инициализирован в VS2015
Отредактировано 26.09.2018 6:15 RainBoy . Предыдущая версия . Еще …
Отредактировано 26.09.2018 6:15 RainBoy . Предыдущая версия .
Re[2]: Обновление MFC проекта с VS2010 на VS2015
От: Nikolaz Германия www.nikeware.com
Дата: 26.09.18 08:25
Оценка: 3 (1) +1
Здравствуйте, RainBoy, Вы писали:

RB>Небольшое дополнение


RB>
CProblemView::CProblemView()
RB>{
RB>    CProblemDoc* pDoc = GetDocument();
RB>    ASSERT_VALID(pDoc);
RB>


RB>Вылетает в Assert и в моем и в сгенерированном VS2015 приложении. pDoc используется в конструкторе, но не инициализирован в VS2015

Э-э ... Это вы сами вписали или это сгенерированный студией код в пустом проекте?
Если во View после его создания нужен доступ к документу,то делать это нужно (в вашем случае) в CProblemView::OnInitialUpdate().

Указатель на документ в СView будет вылидным позже. AddView (см. ниже) вызывается после вот этого кода в твоём приложении:
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CProblemDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CProblemView));
    AddDocTemplate(pDocTemplate);


Пока документ и view не будут "связаны" через pDocTemplate или явно через AddView(CView* pView) у документа — ничего не будет.

Код из MFC:

void CDocument::AddView(CView* pView)
{
    ASSERT_VALID(pView);
    ASSERT(pView->m_pDocument == NULL); // must not be already attached
    ASSERT(m_viewList.Find(pView, NULL) == NULL);   // must not be in list

    m_viewList.AddTail(pView);
    ASSERT(pView->m_pDocument == NULL); // must be un-attached
    pView->m_pDocument = this;

    OnChangedViewList();    // must be the last thing done to the document
}

void CDocument::RemoveView(CView* pView)
{
    ASSERT_VALID(pView);
    ASSERT(pView->m_pDocument == this); // must be attached to us

    m_viewList.RemoveAt(m_viewList.Find(pView));
    pView->m_pDocument = NULL;

    OnChangedViewList();    // must be the last thing done to the document
}
Отредактировано 26.09.2018 8:46 Nikolaz . Предыдущая версия .
Re[3]: Обновление MFC проекта с VS2010 на VS2015
От: RainBoy  
Дата: 26.09.18 19:38
Оценка:
Здравствуйте, Nikolaz, Вы писали:


RB>>Вылетает в Assert и в моем и в сгенерированном VS2015 приложении. pDoc используется в конструкторе, но не инициализирован в VS2015

N>Э-э ... Это вы сами вписали или это сгенерированный студией код в пустом проекте?
N>Если во View после его создания нужен доступ к документу,то делать это нужно (в вашем случае) в CProblemView::OnInitialUpdate().

N>Указатель на документ в СView будет вылидным позже. AddView (см. ниже) вызывается после вот этого кода в твоём приложении:

N>
N>    CSingleDocTemplate* pDocTemplate;
N>    pDocTemplate = new CSingleDocTemplate(
N>        IDR_MAINFRAME,
N>        RUNTIME_CLASS(CProblemDoc),
N>        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
N>        RUNTIME_CLASS(CProblemView));
N>    AddDocTemplate(pDocTemplate);

N>


N>Пока документ и view не будут "связаны" через pDocTemplate или явно через AddView(CView* pView) у документа — ничего не будет.


Это не я писал. Это текущий код, который мне необходимо подружить с VS2015
Он работал в VS2010

Спасибо за ответ!
Re[4]: Обновление MFC проекта с VS2010 на VS2015
От: Nikolaz Германия www.nikeware.com
Дата: 27.09.18 06:59
Оценка:
Здравствуйте, RainBoy, Вы писали:

RB>Он работал в VS2010

Вот это-то и странно. По определению он вообще так не должен работать.
Это всё равно, что у новорожденного дитя (CProblemView::CProblemView()) спрашивать сразу паспорт (GetDocument()).

Конструктор CProblemView именно так и выглядит? Прям вот так сразу GetDocument() ?
Здесь тогда GetDocument() какой-то "хитрый".
Есть у CProblemView его собственная реализация?
Если есть, то там что-то интересное должно быть понаписано

В любом случае — OnInitialUpdate() путь более правильный.

Из MSDN для CView::CView()

Remarks:
The framework calls the constructor when a new frame window is created or a window is split. Override the OnInitialUpdate member function to initialize the view after the document is attached.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.