Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы после конвертации MSVS 2008 --> 2010 
:(
    Опции темы
ksili
Дата 5.12.2010, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Был проект на 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 опять собирался по-умолчанию. Боюсь как бы такая проблема не вылезла с кучей остальных объектов объявленных в классах.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Albor
Дата 5.12.2010, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



OnInitDialog() прекрасно подходит.
PM MAIL ICQ   Вверх
ksili
Дата 6.12.2010, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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, гораздо строже предыдущего?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Albor
Дата 6.12.2010, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Опять-же, разве нельзя проделать то же самое в OnInitDialog() - функции, специально для этого предназначенной?
PM MAIL ICQ   Вверх
ksili
Дата 6.12.2010, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Albor
Дата 6.12.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(ksili @  6.12.2010,  08:51 Найти цитируемый пост)
 Не знал, что OnInitDialog() предназначена для создания
 Просто к моменту вызова OnInitDialog() выделена память под все переменные диалога. У диалога куча дочерних окон, и в конструкторе и в OnCreate() обращаться к ним рано.
PM MAIL ICQ   Вверх
Earnest
Дата 6.12.2010, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.