После нескольких часов поиска в 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, который бы нуждался в пространстве имен для разрешить конфликт).
Есть ли какие-нибудь обходные пути, чтобы оформленное имя соответствовало старому формату?
Большое спасибо заранее за любые предложения.