gpt4 book ai didi

c++ - 修改修饰名——VS6.0到VS2005的迁移

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:54 25 4
gpt4 key购买 nike

在谷歌搜索几个小时后,我想是时候请教专家了。我们有一个遗留模块 (MS Visual C++ 6.0),我们正在尝试将其移植到 VS 2005。存在许多调用应用程序,因此如果可能的话,我们正在尝试保持这些向后兼容。

在代码方面,结果非常简单,几个小时的开发消除了所有编译器错误和大部分警告。

然后我在链接步骤中遇到了一些“未解析的外部符号”错误,这些错误似乎是修饰名称的细微差别。

事实证明,一组错误与 time_t 是 VS2005 中的 64 位结构有关——定义 _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 想要为“CTime”参数包含 ATL 命名空间:

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

如果我用这个新修饰的名称更新我的 .DEF 文件,它会编译并链接...耶!除非我将那个 DLL 与一些曾经工作的代码一起放下,它提示说它无法在 DLL 中找到过程入口点(即具有“旧”结构,没有 namespace 的那个)。

有什么建议吗?是否有某种关键字,编译器指令可以让我告诉编译器不要将命名空间放在修饰名称中(我知道命名空间很好,但与需要命名空间的 CTime 类型没有冲突 afaik解决冲突)。

是否有任何解决方法可以使修饰名称与旧格式匹配?

非常感谢任何建议。

最佳答案

这里其实有两个问题。首先,正如您所发现的,CTime 现在位于 ATL 命名空间中,而且 VS2005 中的 CTime 使用 __time64_t 在内部,它是 64 位,而不是 32 位,并且不会通过定义 _USE_32BIT_TIME_T 来改变。

因此,即使您要修复 namespace 问题,如果您的应用程序是用 VC6 编译的,而 DLL 是用 VS2005 编译的(反之亦然),那么在这些模块之间传递 CTime 对象几乎由于内存布局的不同,肯定会导致数据损坏问题。

在我看来,解决方案是使用 VS2005 重新编译所有代码,并始终使用 64 位 time_t,与 VS2005 中的 CTime 一致(即,不要不要使用 _USE_32BIT_TIME_T)。

希望对您有所帮助!

关于c++ - 修改修饰名——VS6.0到VS2005的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/474947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com