Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > проблемы после конвертации MSVS 2008 --> 2010


Автор: ksili 5.12.2010, 06:04
Был проект на MSVS 2008 (MFC). После конвертации повилась следующая проблема. В одном классе была объявлена переменная 
Код

CProgressCtrl m_Progress;

Далее в конструкторе этого класса:
Код


CUpdateDlg::CUpdateDlg(CWnd* pParent /*=NULL*/)
    : CBaseDlg(CUpdateDlg::IDD, pParent)
{
    m_Progress.SetRange(0, 100);
}


это работало в 2008. После конвертации проект собирается, но при запуске крашится. Выяснилось что в конструкторе m_Progress = null, то есть ещё не создан.

Что мне сделать? Дописать m_Progress.Create()? или что-то можно где-то указать, чтобы этот экземпляр m_Progress опять собирался по-умолчанию. Боюсь как бы такая проблема не вылезла с кучей остальных объектов объявленных в классах.

Автор: Albor 5.12.2010, 07:47
OnInitDialog() прекрасно подходит.

Автор: ksili 6.12.2010, 06:09
Albor, спасибо, помогло.

Дальше другая проблема. Тоже связана с инициализацией диалога.

В классе диалога объявлены переменные:
Код

    CDialogManagerDlg m_dlgManager;
    CHistoryDlg m_dlgViewHistory;


Далее в функции OnCreate:
Код

int CTrayDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialogEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    m_dlgManager.Create     (m_dlgManager.IDD, this);
    m_dlgViewHistory.Create (m_dlgViewHistory.IDD, this);

...
    return 0;

}


Раньше, в MSVS208, это прекрасно работало. Теперь же, как и в предыдущих постах, вылетает эксепшн, и видимо из-за того, что переменные m_dlgManager и m_dlgViewHistory равны 0x00000000. Теперь кроме вопроса "что делать?" у меня добавляется ещё один вопрос более философского характера. В MSVS2010 что ли убрали кучу костылей, которые раньше подправляли не совсем корректный код программистов? Ну там, например, инициализация по-умолчанию.. и т.д. Т.е стандарт С++, используемый в MSVS2010, гораздо строже предыдущего?

Автор: Albor 6.12.2010, 07:36
Опять-же, разве нельзя проделать то же самое в OnInitDialog() - функции, специально для этого предназначенной?

Автор: ksili 6.12.2010, 08:51
Наверное можно. Просто я думал, что в функции создания (create) всё, что надо, создается, а в функции инициализации (init), всё что надо инициализируется. Не знал, что OnInitDialog() предназначена для создания. И, опять же, напрягает, что раньше-то все работало, а теперь - фиг. Проект большой, таких мест, где надо что-то куда-то переносить, может оказаться много.

Автор: Albor 6.12.2010, 09:30
Цитата(ksili @  6.12.2010,  08:51 Найти цитируемый пост)
 Не знал, что OnInitDialog() предназначена для создания
 Просто к моменту вызова OnInitDialog() выделена память под все переменные диалога. У диалога куча дочерних окон, и в конструкторе и в OnCreate() обращаться к ним рано.

Автор: Earnest 6.12.2010, 10:52
ksili, нужно различать C++ объекты и виндовские окна. В конструкторе виндовское окно никогда не создается. И раньше не создавалось. Самое место для инициализации зависимых от окон параметров - OnInitDialog. Вполне могла измениться реализация библиотеки, которая раньше для инициализации не требовала наличие окна, а теперь требует. Или хотя бы зачем-то ASSERT там поставили.
При переходе на другую версию компилятора наивно думать, что все само заработает. Это только c программой "Хелло Ворд" может прокатить. В MSDN есть список изменений, который нужно проштудировать: что-то стразу можно поправить, что-то поставить себе на заметку "протестировать". И тотальное тестирование - мало ли что еще вылезет.
Кроме того, могут вылезти старые баги, которые почему-то раньше прокатывали...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)