Изменение оформленных имен - миграция с VS6.0 на VS2005 - PullRequest
2 голосов
/ 24 января 2009

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

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

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

Оказывается, один набор ошибок был связан с тем, что time_t является 64-битной структурой в 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 ]

3 голосов
/ 24 января 2009

Здесь на самом деле две проблемы. Во-первых, 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).

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

1 голос
/ 25 января 2009

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

...