11

虽然我的理解是没有根本原因为 32 位硬件/操作系统编写的程序不能在 64 位硬件/操作系统上运行,但实际上,我发现许多用于 32 位版本 Windows 的程序不会在 64 位版本的 Windows 上工作。示例包括许多流行的安全实用程序(大多数产品来自 Norton 和 Check Point 的 Zone Alarm)和一些游戏(我一直试图让 Grand Theft Auto 4 运行几个星期,但无济于事 - 当然,这可能与与 GTA4 相关的许多其他问题有关,但这既不是这里也不是那里)。

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

4

8 回答 8

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 字节指针问题不会出现。
于 2008-12-27T16:00:05.510 回答
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

于 2008-12-27T01:10:28.053 回答
3

驱动程序是一个不同的故事:http: //support.microsoft.com/kb/896456

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

于 2008-12-27T01:07:15.953 回答
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 位系统中实际上是两倍长所以你最终会交换错误的观点......这样的事情在低级语言上经常发生,特别是在试图提高性能时......

于 2008-12-27T01:17:15.807 回答
1

32 位到 64 位的迁移注意事项

编辑替代链接

于 2008-12-27T22:48:59.710 回答
1

安全应用程序就是一个不好的例子。他们都针对未记录的事物执行不受支持的事物。从一个 32 位版本的 Windows 到另一个版本的更改足以破坏它们,更不用说迁移到 64 位了。

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

一个由此产生的问题是.NET 应用程序。在 32 位系统上运行时,该 exe 会被调整为 32 位——其中有兼容性填充程序来修复您的错误。如果您的客户碰巧在 64 位系统上运行,则可执行文件将被转换为 64 位,而那些保护您免受自己侵害的兼容性垫片将不再存在。

Chris Jackson 对此有一篇不错的博客文章:Windows Vista 64-Bit 上的 Shimming Applications

于 2009-06-14T01:01:32.880 回答
1

问题可能是驱动程序。对于游戏,它可能是某种黏糊糊的 DRM 方案。尝试获取游戏的无 CD 破解,这样您就可以在没有 DRM 的情况下运行它。

于 2009-06-14T01:11:15.337 回答
0

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

带有 x86 应用程序(如 Norton 和 Check Point 的 Zone Alarm)的产品无法运行其 x86 驱动程序,因为驱动程序需要 x64才能由操作系统运行。

于 2008-12-27T01:03:27.253 回答