Изменение оформленных имен - миграция с 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 могут вызывать ваш обратно совместимый метод.