确保为32位Windows编写的程序与64位Windows兼容

时间:2008-12-27 00:52:27

标签: windows 64-bit backwards-compatibility

虽然我的理解是,为32位硬件/操作系统编写的程序没有在64位硬件/操作系统上运行的基本原因,但在实践中,我发现许多程序适用于32位版本的Windows这不适用于64位版本的Windows。例子包括许多流行的安全实用程序(大多数产品来自Norton和Check Point的Zone Alarm)和几款游戏(我一直试图让侠盗猎车手4运行几周,但无济于事 - 当然,这可能与GTA4相关的任何其他问题有关,但这既不在这里也不在那里。

我听说程序的不兼容可能是因为不想从“Program Files(x86)”文件夹运行这么简单,但其他一些原因是什么?为什么为32位系统编写的病毒扫描程序或防火墙不能在64位系统上运行?当一切理论上都向后兼容时,为什么游戏不会运行?

8 个答案:

答案 0 :(得分:7)

这个帖子有很多错误的信息。

在64位窗口上运行32位应用程序时:

  • 当应用程序尝试安装内核模式驱动程序时,会出现大多数兼容性问题。无法在64位操作系统上安装32位驱动程序。这肯定是防火墙的问题。它试图挂钩到TCP / IP驱动程序堆栈。
  • 没有仿真器! 32位目标代码由cpu完全本机地全速执行。
  • 不支持旧的16位代码。这打破了很多安装人员。
  • 访问正确的文件夹通常不是问题。当32位程序打开文件时,比如%windir%\ system32 \,操作系统会自动将其重定向到%windir%\ syswow64。对于注册表的某些部分也是如此。这里有一些潜在的陷阱,但它们通常是假设各种WINAPI Get ... Directory()函数返回它们在Windows 95中执行的相同字符串。
  • 无论是10年前还是昨天编译,那么C / C ++指针仍然是32位(4字节)和所有假设的代码 - 包括SendMessage()! - 仍然有效。在您开始转换为64位编译器之前,8字节指针问题才会出现。

答案 1 :(得分:4)

我发现这里提供的最好的解释基本上说32位程序是在一层仿真上运行的,它不允许你从64位环境中运行的本机程序获得系统访问:

http://blogs.msdn.com/oldnewthing/archive/2008/12/22/9244582.aspx

我认为这意味着GTA4等程序的问题来自仿真层,而不会产生32位本机系统上的预期结果。这就是您一直看到Microsoft发布兼容性更新的原因。

以下是MSDN对此事所说的话:

http://msdn.microsoft.com/en-us/library/bb427430(VS.85).aspx

答案 2 :(得分:3)

驱动程序与程序不同: http://support.microsoft.com/kb/896456

Zone Alarm使用Check Point创建的特殊32位驱动程序进行监控。这可能是该应用程序产生问题的原因。至于侠盗猎车手4?我不知道。

答案 3 :(得分:2)

可能有很多原因。

任何低级编程的应用程序都可能需要32位寄存器。 novatrust发布的Zone Alarm驱动程序就是一个很好的例子。 GTA4可能正在使用汇编来提高几个点的性能,这可能导致任何事情,甚至只是在C ++上假设32位。例如,请使用以下代码:

struct GPoint
{
  int x;
  int y;
}

// Array of twenty GPoints
GPoint[] myArr = malloc(20 * sizeof(GPoint);

GPoint* myPointer = myArr;
int index = GetIndexAffectedPoint();

// Invert X and Y for the point
myPointer += 8*index;
swap(myPointer);

我知道这个例子非常幼稚,但无论如何,在那个代码中你假设你的结构是8字节长(x整数的4个字节和y整数的4个字节)但是在64位系统中实际上是两倍的时间,所以你最终会交换错误的点...在低级语言上发生的事情很多,特别是在尝试提高性能时......

答案 4 :(得分:1)

答案 5 :(得分:1)

安全应用程序是一个糟糕的例子。他们都对未记录的事物执行不受支持的事情。一个32位版本的Windows到下一个版本之间的更改足以打破它们,永远不要移动到64位。

也就是说,有一些兼容性填充程序可以修复 32位上的代码,而当应用程序 64位时则不会。这是因为Microsoft假设您已经在64位上进行了测试。

一个结果是使用 .NET应用程序。在32位系统上运行时,exe jitted 为32位 - 其中有兼容性垫片来修复您的错误。如果您的客户恰好在64位系统上运行,那么可执行文件将被装配到64位,其中那些保护您自己的兼容性垫片不再存在。

Chris Jackson有一篇很好的博客文章:Shimming Applications on Windows Vista 64-Bit

答案 6 :(得分:1)

问题可能是司机。对于游戏,它可能是某种粘性DRM方案。尝试获取游戏的无CD破解,这样您就可以在没有DRM的情况下运行它。

答案 7 :(得分:0)

如果您使用的是文件系统或注册表,请确保访问正确的文件夹。作为x86程序,您可能希望访问“Program Files(x86)”,“SysWOW64”,“WOW6232Node”等文件夹而不是x64文件夹。

诺顿和Check Point的区域警报等x86应用程序的产品无法运行x86驱动程序,因为驱动程序需要x64 才能运行操作系统。