我听说一个程序的不兼容性可能源于简单地不想从“Program Files(x86)”文件夹运行,但还有其他原因吗?为什么在32位系统上编写的病毒扫描器或防火墙无法在64位系统上运行?一切都应该向后兼容,那么为什么游戏不能运行呢?
这个帖子上有很多错误信息。
当32位应用程序在64位Windows上运行时:
http://blogs.msdn.com/oldnewthing/archive/2008/12/22/9244582.aspx
我会假设这意味着像GTA4这样的程序问题来自模拟层未能产生在32位本地系统上找到的预期结果。这就是为什么你总是看到微软发布兼容性更新的原因。http://msdn.microsoft.com/en-us/library/bb427430(VS.85).aspx
驱动程序与程序不同:
http://support.microsoft.com/kb/896456Zone Alarm使用Check Point创建的特殊32位驱动程序进行监控。这可能是导致该应用程序出现问题的原因。至于《侠盗猎车手4》?我不知道。
可能有很多原因。
任何以低级别编程的应用程序都可能期望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位系统中实际上是两倍长,因此你最终会交换错误的点...这种情况在低级语言中经常发生,特别是在尝试提高性能时...
安全应用程序是一个不好的例子。它们都执行不支持的操作来对抗未记录的事情。从一个32位版本的Windows到下一个版本的更改足以破坏它们,更别说转移到64位。
话虽如此,在32位上有一些兼容性shim可以修复您的代码,但在64位应用程序上则无法实现。这是因为Microsoft假定您已经在64位上进行了测试。
其中一个结果是.NET应用程序。在32位系统上运行时,exe被jit到32位 - 在那里有兼容性shim来修复您的错误。如果您的客户碰巧在64位系统上运行,则可执行文件将被jit到64位,其中保护您免受自身影响的兼容性shim将不再存在。
Chris Jackson在他的博客中有一篇很好的文章:Shimming Applications on Windows Vista 64-Bit
问题可能是驱动程序。对于游戏来说,可能是某种肮脏的数字版权管理方案。尝试获取游戏的无光盘破解补丁,这样你就可以在没有数字版权管理的情况下运行它。
如果您正在使用文件系统或注册表,请确保您访问正确的文件夹。作为x86程序,您可能希望访问“Program Files(x86)”,“SysWOW64”,“WOW6232Node”等文件夹,而不是x64文件夹。
像诺顿和Check Point的Zone Alarm这样具有x86应用程序的产品无法运行其x86驱动程序,因为驱动程序需要x64才能被操作系统运行。