| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > проблемы после конвертации MSVS 2008 --> 2010 |
| Автор: ksili 5.12.2010, 06:04 | ||||
Был проект на MSVS 2008 (MFC). После конвертации повилась следующая проблема. В одном классе была объявлена переменная
Далее в конструкторе этого класса:
это работало в 2008. После конвертации проект собирается, но при запуске крашится. Выяснилось что в конструкторе m_Progress = null, то есть ещё не создан. Что мне сделать? Дописать m_Progress.Create()? или что-то можно где-то указать, чтобы этот экземпляр m_Progress опять собирался по-умолчанию. Боюсь как бы такая проблема не вылезла с кучей остальных объектов объявленных в классах. |
| Автор: Albor 5.12.2010, 07:47 |
| OnInitDialog() прекрасно подходит. |
| Автор: ksili 6.12.2010, 06:09 | ||||
| Albor, спасибо, помогло. Дальше другая проблема. Тоже связана с инициализацией диалога. В классе диалога объявлены переменные:
Далее в функции OnCreate:
Раньше, в 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 |
| Просто к моменту вызова OnInitDialog() выделена память под все переменные диалога. У диалога куча дочерних окон, и в конструкторе и в OnCreate() обращаться к ним рано. |
| Автор: Earnest 6.12.2010, 10:52 |
| ksili, нужно различать C++ объекты и виндовские окна. В конструкторе виндовское окно никогда не создается. И раньше не создавалось. Самое место для инициализации зависимых от окон параметров - OnInitDialog. Вполне могла измениться реализация библиотеки, которая раньше для инициализации не требовала наличие окна, а теперь требует. Или хотя бы зачем-то ASSERT там поставили. При переходе на другую версию компилятора наивно думать, что все само заработает. Это только c программой "Хелло Ворд" может прокатить. В MSDN есть список изменений, который нужно проштудировать: что-то стразу можно поправить, что-то поставить себе на заметку "протестировать". И тотальное тестирование - мало ли что еще вылезет. Кроме того, могут вылезти старые баги, которые почему-то раньше прокатывали... |