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