大多数我最近编程上已有32位Windows使用C++/C#/维生素b6.最近,我的客户要求,如果我的代码将上运行的64位的窗口。

我想知道什么是传统功能,我可能被使用,这将打破在64位Windows?什么是一些真实世界的问题我需要考虑和担心的?

显然,我将考验我的代码中的64位的操作系统,但我想知道什么是共同的问题寻找。我更关心的是现有的二进制文件,但我的评论什么要担心当重新编译(尽可能).

编辑:这里是一个 好的名单 64位移植的错误。

其他提示

就我而言,一个最重要的事情有关移植C/C++码64位Windows是 测试你的应用程序 MEM_TOP_DOWN 分配启用(AllocationPreference 注册值) 作为描述 4千兆字节的调整:

迫的拨款分配从更高的地址之前,下地址为测试目的,指定 MEM_TOP_DOWN 打电话时 VirtualAlloc 或者设置以下注册值0x100000:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference

当做这事?

  • 如果你有现有的32位前任,建立与 /LARGEADDRESSAWARE MSVC接头的选择(或有 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志的设置在他们的PE头通过其他手段,例如 editbin.exe),然后他们得到一个完整的4个地址的虚拟空间有64位Windows,你必须试验他们的 AllocationPreference 登记册的价值设定的。
  • 如果你有现有的32位Dll,可能是装大地址意识到前男友,你必须试验他们的 AllocationPreference 登记册的价值设定的。
  • 如果你要重新编译C/C++码进入的64位EXE或DLL,你必须试验它 AllocationPreference 登记册的价值设定的。

如果你C/C++应用程序落入一个这三种类别,你不要测试 MEM_TOP_DOWN 分配、测试是非常不可能赶上任何指截断/符号规范虫子在你的代码。

第二个最重要的事情,如果你使用MSVC和你重新编译C/C++码64位,是 使用 /Wp64 编译器的选择你的 64位 建立:

  • 这将导致编译器发警告的类型转化,截断指针或延长小组成的类型为指针,(即使在 reinterpret_cast 或C的样式转换是使用),以及一些其他的64位移植的问题。
  • 是的, 文档 说说,而不是编纂与 /Wp64 你应该用一个编译器目标的64位的平台,但这本身不会赶上的指针截断/扩展问题的在编译时间。使用一个编译器目标的64位 启用 /Wp64 编译器选择的64位的建立将会赶上的许多指截断/扩展问题,在编制时间,这将节省时间的长远目标。
  • 不幸的是,与MSVC2008年,这也将产生一个"命令行警告"对于每个单元翻译说的 /Wp64 选项已被否决。我可以看到为什么选择使用为32位的建立(其中它是一个邪恶的黑客,需要注释你的许多类型定义),但这是不幸的,它也是废弃的64位建立(其中它实际上是有用的)。

这可能是更容易迁移.NET代码,如果你有100%的“类型安全的托管代码”。 你可以把它复制到64位平台和64位CLR下成功运行它。 勾选此 MSDN链接在迁移32位托管代码到64位。

顺便说一下,Hanselman的最近在博客的话题。

如果你是在谈论32位程序,那么你必须几乎完全不用担心自Windows 64将运行这些模拟情况下为32位。与将来的Windows版本(视窗e.g 7)的任何问题都可能是不兼容的,而不是问题与64位操作系统。

但是,如果您的托管代码被编译为“任何CPU”的目标平台,您拨打电话到非托管代码(例如PInvoke的),或依赖于其他组件,然后有一些事情要注意的。斯科特Hanselman的帖子有关在x86 / x64的CLR覆盖该和是在CLR的一个很好的解释的Win32 / 64。

当显影64位机程序则编程指南64位Windows 是一个很好的指南。它在很大程度上归结为指针和数据类型的大小:)

32位的程序将运行现在64位的窗口。只要你不做任何装置驱动的发展的课程。

如果你编译软件作为64位软件的第一次,你需要照顾下:

  • 一指针是64位,同时int是32位。不存储指针在整数、你的代码会破裂。
  • 64位进程需要64位Dll。如果取决于第三部分Dll,确保他们还提供了64位。如果你需要之间的通信的一个32位进程和64位进程中,你会需要一些对许多不同的方式IPC。叫功能直接出的问题。
  • 该系统目录上的64位Windows是不同的32位的窗口。如果你有一些硬盘编码的路径,可能需要检查他们了。

如果您出于任何原因,你会遇到麻烦做DLL注入。

从C / C ++透视....

一个明显的是,int的大小将变得8个字节,而不是4个字节。如果您的代码是依赖于你可能会得到意想不到的效果。结构和可变比对可能偏移。您可以使用的#pragma包来克服它,但我不是在比对和包装非常流畅。

如果您使用任何工会与他们整数,该行为可能会改变。

如果使用的是任何位域的结构,基于整数额外的32位可能会引起混淆。符号位也不会,你以为是。

如果你的代码的任何十六进制常量和预期的迹象去负,你可能有问题。例 为0x8000000是负数为日志,或32位的整数。 0x80000000的作为一个64位的平台上的整数是一个正数。直接设置符号位,你将不得不使用0x80000000的00000000(出于可读性嵌入空间只)

此外,我期望size__t适当地生长。如果您正在基于MAX_INT任何分配,他们将大得多。

要避免这些类型大小异常的,我一般坚持使用多头代替整数。

是32位仿真真的防弹?我已经看到,在注册表中奠定了有点不同。我只是想知道什么典型的事情不工作...

另外,在C:\ Windows \ system32目录只能包含64位的DLL。如果你有一个32位的DLL,你需要把它放在C:\ WINDOWS \ SysWow64资料\

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top