虽然我的理解是,为32位硬件/操作系统编写的程序没有在64位硬件/操作系统上运行的基本原因,但在实践中,我发现许多程序适用于32位版本的Windows这不适用于64位版本的Windows。例子包括许多流行的安全实用程序(大多数产品来自Norton和Check Point的Zone Alarm)和几款游戏(我一直试图让侠盗猎车手4运行几周,但无济于事 - 当然,这可能与GTA4相关的任何其他问题有关,但这既不在这里也不在那里。
我听说程序的不兼容可能是因为不想从“Program Files(x86)”文件夹运行这么简单,但其他一些原因是什么?为什么为32位系统编写的病毒扫描程序或防火墙不能在64位系统上运行?当一切理论上都向后兼容时,为什么游戏不会运行?
答案 0 :(得分:7)
这个帖子有很多错误的信息。
在64位窗口上运行32位应用程序时:
答案 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 才能运行操作系统。