Изменение оформленных имен - миграция с VS6.0 на VS2005

После нескольких часов поиска в Google, я думаю, пришло время спросить экспертов. У нас есть устаревший модуль (MS Visual C++ 6.0), который мы пытаемся перенести на VS 2005. Существует несколько вызывающих приложений, поэтому мы стараемся, если это возможно, сохранять их обратно совместимыми.

В отношении кода это оказалось довольно простым, и несколько часов разработки устранили все ошибки компилятора и большинство предупреждений.

Затем я столкнулся с несколькими "неразрешенными внешними символами" на этапе компоновки, которые кажутся тонкими различиями в оформленном имени.

Оказывается, один набор ошибок был связан с 64-битной структурой time_t в VS2005, определяющей _USE_32BIT_TIME_T исправил эти три.

Теперь я застрял с двумя оставшимися ошибками:

Функция определяется как

int RC_STATE::my_function(UINT stateId, UINT period, UINT index, UINT paramtype, UINT dpindex, UINT managerId, UINT calctype, UINT status, double *p_val, long *p_isc, CTime *p_time)

Похоже, что под "старой" Visual Studio она была довольна украшенным названием

?my_function@RC_STATE@@QAEHIIIIIIIIPANPAJPAVCTime@@@Z

Но теперь VS2005 хочет включить пространство имен ATL для параметра "CTime":

?my_function@RC_STATE@@QAEHIIIIIIIIPANPAJPAVCTime@ATL@@@Z

Если я обновлю свой файл.DEF этим новым оформленным именем, он скомпилирует и ссылки... ууу! За исключением того, что, как только я добавляю к этой DLL какой-то код, который раньше работал, он жалуется, что не может найти точку входа процедуры в DLL (то есть ту, что имеет "старую" структуру, без пространства имен).

Какие-либо предложения? Есть ли какое-то ключевое слово, директива компилятора, которая позволила бы мне сказать компилятору не помещать пространство имен в декорированное имя (я знаю, что пространства имен хороши, но на самом деле нет конфликта с типом CTime, который бы нуждался в пространстве имен для разрешить конфликт).

Есть ли какие-то обходные пути, чтобы оформленное имя соответствовало старому формату?

Большое спасибо заранее за любые предложения.

2 ответа

Здесь на самом деле две проблемы. Первый, CTime сейчас в ATL пространство имен, как вы уже нашли, но также CTime в VS2005 использует __time64_t внутренне, что составляет 64 бита, а не 32 бита, и это не изменяется путем определения _USE_32BIT_TIME_T,

Таким образом, даже если вам нужно исправить проблему с пространством имен, если ваше приложение скомпилировано с VC6, а DLL скомпилировано с VS2005 (или наоборот), передача CTime объекты между этими модулями почти наверняка приведут к проблемам с повреждением данных из-за разницы в расположении памяти.

На мой взгляд, решение состоит в том, чтобы перекомпилировать весь ваш код с VS2005 и использовать 64-битный time_t во всем, в соответствии с CTime в VS2005 (т.е. не использовать _USE_32BIT_TIME_T).

Надеюсь, это поможет!

Другой возможностью было бы скопировать старое определение CTime в ваш проект VS2005 и использовать его в списке параметров функции, в которой вы пытаетесь сохранить совместимость. Затем перед обработкой преобразуйте обратно совместимый параметр CTime в новый ATL::CTime. Старые клиенты VC6 могут вызывать ваш обратно совместимый метод.

Другие вопросы по тегам