Да, это непросто
От: FarFrom  
Дата: 28.07.07 21:33
Оценка:
Есть опыт переноса небольшого (<30000 строк) проекта с MS VS6 — 2003 на VS2005.
Проект был на С++, MFC, MDI, многопоточность. Код слабо документирован, написан начинающими
программистами, но работает годами, все фичи на месте. Время поджимало, поэтому рефакторинга избегали.
Так как часть разработчиков работало в шестерке, старались обеспечивать компиляцию в разных версиях.

1. Ошибки компиляции — в основном связаны с индексами в операторах цикла for — исправляются легко.

2. Размер time_t изменен. Может измениться физическое представление структур данных. Соответственно легко напороться на проблему с несовместимостью версий файлов сохраненных данных, если использовалась запись структуры как бинарного объекта, например:
file.Write( &obj, sizeof( obj));

3. Выползают ошибки в коде, которые не обнаруживались в VS6, все работало и BounceCheсker просмотрел.
Трудно привести пример, но это так. Контроль нарушения стека рулит. Можно даже посоветовать использовать новую студию как средство обнаружения ошибок в коде. А после очистки кода можно опять собрать проект в старой, если надо.

4. Замеченные несовместимости:
— в шестерке деструкторы нужно делать публичными, даже если конструктор приватный.
— интерлокед функции имеют другую сигнатуру.
— достает петрушка с INVALID_HANDLE_VALUE — сменился у нее тип,
а мы везде использовали эту константу как признак неудачного открытия файла.

5. Такое ощущение, что по-другому работает MFC.
Вызов GetMainWindow() в зависимости от рабочего потока стал возвращать нулевой указатель, с понятными последствиями. Или это такое безопасное приведения типа? Пришлось (стиснув зубы старался удержаться от серьезного рефакторинга) ввести статический указатель на главное окно.

6. Такое ощущение, что по-другому работают потоки. В работающий годами код пришлось вносить изменения. Например, в функции инициализации потока, уже после вызова CreateThread устанавливался флаг разрешения работы потока. В программе скомпилированной в новой студии поток стартует до завершения функции инициализации и соответственно получает еще не установленный флаг.
Да, ошибка, но она раньше не проявлялась. Все, что связано с потоками, пришлось перетряхивать, заново отлаживать. (Может это эффект стресс-теста — смотри ниже)

7. Возникало ощущение, что программа, собранная в новой студии, уступает в производительности,
собранной в старой.!?? Возможно это связано с тем, что оперативки было не много, а студия висела в памяти и наверное vs2005 захватывает больше памяти, а приложению остается меньше.

В целом вывод: если вам примерно такой проект как у меня достался, и если есть время
— переносите обязательно — много ошибок в коде можете исправить.
Ну и новых в этом процессе можете понаделать... Успехов.

P.S. Тема то серьезная, может гуру накидают поконкретнее ссылок, а то у меня все больше ощущения.
... << RSDN@Home 1.2.0 alpha rev. 676>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.