为什么 64 位 Windows 需要单独的“Program Files (x86)”文件夹?

为什么 64 位 Windows 需要单独的“Program Files (x86)”文件夹?

我知道在 64 位版本的 Windows 上,“Program Files”文件夹用于 64 位程序,“Program Files (x86)”文件夹用于 32 位程序,但是这有什么必要呢?

我说的“必要”并不是说“为什么微软不能做出其他设计决定?”因为他们当然可以。相反,我的意思是“鉴于 64 位 Windows 的当前设计,为什么 32 位程序必须有一个与 64 位程序不同的顶级文件夹?”换句话说,“如果我以某种方式避开重定向机制并强制将所有内容安装到真实目录中,会发生什么问题C:\Program Files\?”

Super User 和其他网站上有很多问题声称“一个是针对 32 位程序,一个是针对 64 位程序”,但我找不到任何原因。根据我的经验,它不会似乎32 位程序是否安装在正确的位置并不重要。

Windows 是否以某种方式与在“Program Files (x86)”中运行的程序有所不同?是否有描述确切说明在“Program Files (x86)”而不是“Program Files”中安装的程序有何不同?我认为微软不太可能在没有正当技术原因的情况下引入新文件夹。

答案1

简短的回答:确保旧的 32 位应用程序继续以以前的方式工作,而不会对 64 位应用程序施加会造成永久性混乱的丑陋规则。

这不是必需的。它只是比其他可能的解决方案更方便,例如要求每个应用程序创建自己的方法来将 32 位 DLL 和可执行文件与 64 位 DLL 和可执行文件分开。

主要原因是让 32 位应用程序(即使不知道 64 位系统的存在)也能“正常工作”,即使在应用程序可能查找的位置安装了 64 位 DLL。32 位应用程序无法加载 64 位 DLL,因此需要一种方法来确保 32 位应用程序(可能早于 64 位系统,因此不知道 64 位文件的存在)不会找到 64 位 DLL,尝试加载它,失败,然后生成错误消息。

最简单的解决方案是始终使用单独的目录。实际上,唯一的选择是要求每个 64 位应用程序将其可执行文件“隐藏”在 32 位应用程序看不到的地方,例如bin64该应用程序内的目录。但这会给 64 位系统带来永久的丑陋,只是为了支持旧版应用程序。

答案2

它允许您安装应用程序的 32 位和 64 位版本,而不会覆盖自身。


第二天看了这个回答和评论帖后,我意识到我的回答可能存在重大疏忽。我错误地假设我有编程背景,当我谈论在我的评论中,我不是指用户,而是指程序员。

我不在微软工作,我也不知道真实的这些文件夹背后的原因是,但我认为这些文件夹的原因非常明显,因此我可以毫无问题地争论它。

因此让我们来分解一下!

  1. 文件夹太棒了!

    让我们就某件事达成一致。文件夹很棒!我们不需要它们,我们有足够多的文件名来将每个文件放在硬盘的根目录下,那么为什么要有文件夹呢?

    嗯,它们帮助我们整理东西。整理东西很棒。它帮助我们更轻松地处理事情。这在使用需要结构的机器时尤其有用。

  2. 分离数据和逻辑很棒!

    编程中常见的一种范式是将数据与逻辑分开。你需要一个部分知道如何做某事你想要另一部分可以做某事

    在文件系统中也发现了这一点。

    我们有用于应用程序(逻辑)的文件夹和用于存放贵重物品(数据)的文件夹:

    逻辑

    • %WINDIR%
    • %PROGRAMFILES%
    • %PROGRAMFILES(x86)%

    数据

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    所以,文件夹似乎很棒,将程序放在自己的小文件夹中也很有意义。但为什么要有 2 个呢?为什么不让安装程序处理这个问题并将所有内容放入一个Programs文件夹中呢?

  3. 安装程序不是魔术

    如今,我们经常使用小程序来安装较大的程序。我们称这些为小程序安装程序

    安装程序不是魔法。它们必须由程序员编写,并且像其他任何应用程序一样是应用程序(可能有错误)。那么让我们来看看一个假想的程序员必须面对的情况没有现行制度:

    1 个 Program Files 文件夹

    开发人员维护 2 个安装程序。一个用于 32 位版本,一个用于 64 位版本。32 位安装程序将写入C:\Program Files\App\,64 位安装程序将写入C:\Program Files\App\sixtyfour\

    2 个 Program Files 文件夹

    开发人员维护 1 个安装程序。安装程序将始终写入操作系统%PROGRAMFILES%并依赖于操作系统来相应地扩展路径(实际上,在这些情况下您不会使用环境变量,而是使用调用SHGetKnownFolderPathFOLDERID_ProgramFiles检索正确的路径)。
    一切都找到了它的位置自动地模式是与您安装的每个应用程序相同

  4. 一致性是有意义的

    当你学习某些东西,通常意味着观察到的行为是一致的。否则就没有什么可观察和学习的。

    对于我们的小文件系统来说也是如此。总是把同样的东西放到相同的文件夹中。这样,当我们寻找某些东西时,我们就知道该去哪里找。

    32/64 应用程序区分系统进一步实现了这一目标。应用程序被分成两个位置,以避免名称、二进制加载行为和安全性(在一定程度上)发生冲突。

我还是不明白。这似乎没用

你永远不应该忘记一件事。人们非常愚蠢。这包括用户、超级用户,尤其是程序员。

这就是为什么我们需要这样的东西文件系统重定向甚至使我们的系统可用。

程序员只需进去并尝试加载C:\Windows\system32\awesome.dll,而不关心它们是在 32 位还是 64 位系统上运行。它们会尝试加载 64 位 DLL,然后直接崩溃。有些程序员想使用一些 Office DLL,没问题,他们知道在哪里可以找到它!C:\Program Files\Microsoft\Office\14.0\wizards.dll... 然后又崩溃了!

32 位应用程序的所有这些请求都是重定向转换为32位版本以避免应用程序崩溃。

我们需要一些固定的文件夹名称来构建这样的系统。如果没有文件夹结构来支持这种重定向,那么您将如何使其工作?

好的,现在我明白了。但是为什么不使用C:\Program Files\x86\呢?

现在我们开始进行哲学思考...

如果我以某种方式避免重定向机制并强制将所有内容安装到真实系统中,会发生什么问题C:\Program Files\

很可能什么都没有(只要其他应用程序不依赖于该应用程序的固定位置)。

WOW64机制会挂钩CreateProcess并对可执行映像执行更复杂的检查(比检查可执行文件的文件夹名称更复杂),以确定它是 32 位还是 64 位。

是的,但我的意思是,所有的应用程序!

  • 如果我把会发生什么两个都把柴油和汽油加到我的车里吗?
  • 如果我尝试使用会发生什么两个都交流电和直流电在同一线路上吗?
  • 如果我继续,会发生什么?两个都我能把我的猫和鱼放在同一个水族箱里吗?

有些问题不需要答案。这不是要做的事情,不要做。这样做没有任何好处。这种改变可能造成的问题数量将总是超过人们从中可能看到的任何好处。

答案3

总结:

总而言之,不是必要的; 他们可以已经使用了一个文件夹,并且,Windows 不会以不同于从一个位置或另一个位置运行的程序的方式呈现自身。


好吧,似乎每个人都在对此发表自己的意见,所以我也来谈谈我的看法。其他人已经猜测了原因为什么微软选择为 32 位和 64 位版本的程序创建单独的顶层文件夹,所以我将保留这部分(最好的理由是 David 解释说这是为了方便程序员)。当然,即便如此,它也没有完全解决直接的问题这有什么必要呢?,答案大概是:它不是

相反,我将回答这个问题的主体

Windows 的表现形式与“Program Files (x86)”运行的程序有什么不同吗?

不是,但该项目的地点影响行为,但方式并非你所想象的那样。

当您运行程序时,Windows 会设置一个运行该程序的环境(我指的是内存、寻址等方面,而不仅仅是环境变量)。此环境取决于可执行文件的内容(32 位和 64 位程序在内部有所不同)。当您在 64 位系统上运行 32 位程序时,它会在模拟 32 位环境的 32 位子系统中运行。它被称为WoW64(WoW64 代表Windows 64 位上的 Windows)类似于 16 位应用程序在 XP 中的运行方式,使用电视数字电视监测系统

无论是否具有管理员权限,运行程序时都会影响其运行方式,但位置应该不会影响它(尽管有一些位置依赖的例子,例如一些驱动程序)。

(我使用的是另一台电脑,所以我不能依靠浏览器历史记录来回溯我的步骤,但前几天在回答这个 SU 问题我最终这个问题这让我Google PROCESSOR_ARCHITEW6432这导致这个问题这篇微软博客文章

在此过程中,我读到一篇 StackOverflow 帖子,介绍了环境变量%processor_architecutre% 根据您运行命令提示符的位置,给出不同的结果(我会尝试找到准确的引述)。

答案取决于运行的是 32 位还是 64 位版本的命令提示符(即从System32\SysWoW64\)。换句话说,虽然位置好像影响程序的行为,这只是因为程序存在不同版本,而不是因为 Windows 以特殊方式对待文件夹。

这是有道理的,因为可执行文件的内容决定了它是 32 位还是 64 位,所以您可以将同一个程序(例如foobar32.exefoobar64.exe)的 32 位和 64 位副本放在同一个文件夹中,当您执行它们时,它们将被正确加载(64 位版本将本地运行,而 32 位版本将在 WoW64 仿真层中运行)。

FreePascal 允许您安装 DOS 和 Windows 版本,它们位于同一个文件夹中:%programfiles%\FreePascal。它通过将可执行文件(、、、.exe等)保存在单独的文件夹中并共享资源文件(如图片、源文件等)来管理不同的体系结构。没有技术原因导致无法对程序的 32 位和 64 位版本执行此操作。就像 David 所说的那样,如果将它们分开保存,对程序员来说会更容易(即使用变量使其看起来只有一组文件等)。.sys.dll.ovr

答案4

微软针对从 32 位到 64 位的过渡的解决方案是增加对大多数 32 位应用程序的旧版支持。换句话说,大多数 32 位应用程序都可以在 64 位操作环境中运行。请记住,在 64 位架构上运行的其他操作系统根本无法加载或运行 32 位应用程序。

为了帮助简化过渡,微软指定所有 32 位应用程序应默认加载到 Program Files (x86) 文件夹中,而不是与常规 Program Files 文件夹中的真正的 64 位应用程序混合在一起。

来源

“如果我以某种方式避开重定向机制并强制将所有内容安装到真正的 C:\Program Files\,会发生什么问题?”

没什么。这两个程序目录仅用于组织,或将具有 32 位和 64 位版本的程序分开,例如 Internet Explorer。但是您可以在“Program Files”中安装 32 位程序,在“Program Files x86”中安装 64 位程序,什么也不会发生,程序将以相同的方式运行。

维基百科说:

某些应用程序安装程序拒绝在安装路径位置中使用空格。对于 32 位系统,Program Files 文件夹的简称为计划~1对于 64 位系统,64 位 Program Files 文件夹的简称为 Progra~1(与 32 位系统相同);而 32 位 Program Files (x86) 文件夹的简称现在为计划~2

相关内容