Добрый день.
Есть 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 в полном объеме у меня не вышло.
Если у кого-то были позожие глюки при обновлении, буду рад услышать мнения и советы.
Спасибо!
Небольшое дополнение
CProblemView::CProblemView()
{
CProblemDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
Вылетает в Assert и в моем и в сгенерированном VS2015 приложении. pDoc используется в конструкторе, но не инициализирован в VS2015
Здравствуйте, 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
}
Здравствуйте, 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
Спасибо за ответ!
Здравствуйте, 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.