Windows开发:x86到x64的过渡

时间:2010-03-15 20:33:26

标签: c++ windows x86 64-bit

是否有任何指导如何尽可能少地转移到x64?

假设我有一个用C ++编写的windows native x86可执行文件。 EXE本身工作正常,但也有由前两个EXE和外部x64进程托管的DLL。使用这样的设置,我需要重写哪些部分?

我希望得到一个更一般的答案,或者可能是参考文献的链接,其中给出了一些理论背景。感谢

3 个答案:

答案 0 :(得分:5)

一般来说,我推荐的方法是对它进行单元测试。构建测试,以便它们全部传递32位实现,然后开始构建和测试64位。值得特别注意您执行以下任何操作的代码的任何部分:

  • 通过网络流式传输数据(特别是size_t类型的数据,现在大小不同。请仔细阅读此代码,将size_tlong等内容更改为显式32或64位typedefs)
  • 将二进制数据加载/保存到文件(ditto re:size_t / long)
  • 使用硬编码值(例如0xFFFFFFFF
  • )进行比特操作

除了测试尽可能多的代码路径之外,确实没有快捷方式。这项工作的简单程度取决于编写代码的可移植性。你可能很幸运......

答案 1 :(得分:3)

SDK article列出了64位Windows的注意事项。 MSVC ++特定注意事项为listed here。通常,只编译代码将清除大多数问题。我不能评论你的具体情况,它不够详细。

答案 2 :(得分:2)

我发现清除错误的最佳方法是审核代码,查找执行以下任何操作的代码并在32位世界中修复它,然后启动端口。

  • 使用无类型的容器和强制转换而不是正确的容器。
  • 无论出于何种原因,使用强制转换以DWORD格式存储指针,通常作为存储在容器中的最终前奏
  • 存档时
  • 投射

对于您确实需要执行DWORD / ptr操作的情况,请将类型更改为DWORD_PTR。

我见过很多使用CStringToPtr的代码而不是CMap<>适当的类型。

所有这些东西都可能在64位上编译(由于演员阵容而没有警告),然后在他们的脸上黯然失色。如果他们使用了正确的类型并且没有强制转换,则代码将首次运行。

同时检查是否有任何设置WndProc的子类代码 - 你需要一个不同的标志来在64位Windows上设置它。

如果使用MFC,您也会(无益地)发现容器大小现在返回64位大小而不是32位大小计数,这意味着您的32位/ 64位存档将被破坏。你必须在你去的时候解决这个问题。我们使用一些聪明的技巧创建了我们自己的自定义MFC实现,以允许我们在64位盒上反序列化32位存档,反之亦然。