代码之家  ›  专栏  ›  技术社区  ›  Kerido

Windows开发:x86到x64的过渡

  •  4
  • Kerido  · 技术社区  · 16 年前

    有没有什么指导原则可以让你在尽可能少的痛苦下过渡到x64?

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

    如果能给我一个更笼统的答案,或者是一个参考文献的链接,其中给出了一些理论背景,我将不胜感激。谢谢

    3 回复  |  直到 16 年前
        1
  •  5
  •   the_mandrill    16 年前

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

    • 通过网络传输数据(尤其是针对 size_t 现在它将是一个不同的尺寸。通过这段代码,改变一些事情,比如 尺寸 和 long 显示32位或64位typedefs)
    • 将二进制数据加载/保存到文件(同上:大小\u t/long)
    • 使用硬编码值(例如0xFFFFFFFF)进行位旋转

    除了测试尽可能多的代码路径,实际上没有捷径。这项工作有多容易将取决于代码编写的可移植性。你可能很幸运。。。

        2
  •  3
  •   Hans Passant    16 年前

    这 SDK article 列出64位Windows的注意事项。MSVC++的具体注意事项如下: listed here .一般来说,只需编译代码就能解决大多数问题。我不能评论你的具体情况,它不够详细。

        3
  •  2
  •   Stephen Kellett    16 年前

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

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

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

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

    所有这些东西可能都会在64位上编译(由于演员阵容,没有警告),然后就完蛋了。如果他们使用了正确的类型,并且没有强制转换,那么代码第一次就可以工作。

    还要检查设置WndProc的任何子类代码——在64位Windows上设置WndProc需要一个不同的标志。

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

    推荐文章