我有一个64位架构的项目
现在我希望将其迁移到32位系统。它使用INT64
指针操作。我应该对当前系统做出哪些改变?解释所需的一般性更改的一些示例将是有帮助的
PS:运行代码时会抛出错误"Invalid address specified to RtlValidateHeap( 004F0000, 02A90EB8 )"
,有时会"Critical error detected c0000374"
我搜索了这两个错误,但无法找到解决方法。
答案 0 :(得分:3)
将x64应用程序从一个位置迁移到另一个位置时要记住的一些事项(Windows平台)
检查每个sizeof(),假设指针大小为8
pointer = (INT64) (other_pointer + sizeof(val));
如果您使用GUI工具包直接操作Windows句柄(例如MFC),请记住,当在32位系统(或仿真sysWoW - Windows上的Windows)上运行时,HWND和其他内部指针使用较小的大小
留意#ifdef _WIN64
宏观点
内联汇编 BAD 的便携性,内在函数通常也是特定于平台的
32位应用程序仅链接32位库,当然,检查依赖项
最后,如果目标环境是x86_64,请记住,在Windows上,关于32位应用程序如何虚拟化文件系统和注册表编写(他们有专门的子站点)可能会有所不同。
祝你好运。答案 1 :(得分:1)
通常,使用“太大”的指针存储本身不应成为问题。这就像拥有一个18位数的计算器并且只使用9位数 - 没有什么不好的[并且我确信你的64位代码不会“溢出”它们的64位值,即使在较低的48位,因为x86-64体系结构中不允许这样做(代码必须区分高地址和低地址,并确保符号扩展保持低48位 - 如果不这样做,处理器将抛出异常)]。
当然,为了节省空间,您可能应该使用intptr_t
或uintptr_t
而不是INT64
,但除了空格之外,使用{{1}真的应该不会有问题在32位系统中存储和操作指针[我已经研究过这样做的代码,因为代码本身并不“知道”底层的位数]
我怀疑你的问题来自某种无效的计算,但是如果没有实际检查代码,实际上不可能确切地说出问题究竟是什么。
堆错误听起来像堆损坏(写入超出存储的末尾) - 一个猜测是代码假设INT64
和指针大小相同。可能很难说,但是如果你可以将错误作为断点捕获,那么你可以回顾堆栈以查看数据的来源并尝试确定实际发生的事情。
虽然我说它通常在第一段中起作用,但我也会说使用任何形式的转换指针指向整数,做数学运算,将整数转换回指针,这是一件坏事。不是因为它在技术上不起作用,而是因为它很难维护,并且通常有其他方法可以通过适当定义相关数据结构来实现这一点。 “闻起来很糟糕”,因为“代码气味”类型会说。