为什么在 64 位 Windows 上 64 位 DLL 转到 System32,而 32 位 DLL 转到 SysWoW64?

StackOverflow https://stackoverflow.com/questions/949959

我想知道我们什么时候需要将文件放在

C:\Windows\System32 或 C:\Windows\SysWOW64(在 64 位 Windows 系统上)。

我有两个 DLL,一个用于 32 位,一个用于 64 位。

从逻辑上讲,我认为应该将 32 位 DLL 放在 C:\Windows\System32 下,将 64 位 DLL 放在 C:\Windows\SysWOW64 下。

令我惊讶的是,它是 另一种方式!这 32-bit 1 进入 C:\Windows\SysWOW64, ,以及 64-bit DLL 进入 C:\Windows\System32.

非常令人困惑的东西。这背后的原因是什么?

有帮助吗?

解决方案

我相信其目的是重命名 System32,但有太多应用程序针对该路径进行了硬编码,因此删除它是不可行的。

SysWoW64 并不是为 64 位系统的 dll 设计的,它实际上类似于“Windows on Windows64”,意思是在 64 位 Windows 上运行 32 位应用程序所需的位。

本文 解释一下:

“Windows x64 有一个目录 System32,其中包含 64 位 DLL(原文如此!)。因此,位数为 64 的本机进程会在它们期望的位置找到“它们的”DLL:在 System32 文件夹中。第二个目录 SysWOW64 包含 32 位 DLL。文件系统重定向器具有隐藏 32 位进程的真实 System32 目录并以 System32 名称显示 SysWOW64 的魔力。”

编辑:如果您谈论的是安装程序,那么您确实 不应该 硬编码系统文件夹的路径。相反,让 Windows 根据您的安装程序是否在模拟层上运行来为您处理。

其他提示

我要补充:你不应该把你的DLL到\ SYSTEM32 \反正!修改代码,修改您的安装......找一个家为你的比特是不是在C的任何地方:\ WINDOWS \

例如,安装人员把你的DLLs成:

\program files\<your app dir>\

or

\program files\common files\<your app name>\

注意你真正做到这一点的方式的是使用环境VAR中:%ProgramFiles%或 的%ProgramFiles(x86)的%以找到程序文件......你不要以为它是C:\ Program Files文件\ ....)

和然后设置一个注册表标记:

HKLM\software\<your app name>
-- dllLocation

使用您的DLL读取注册表中的代码,然后动态地链接到的dll在该位置。

以上是去聪明的办法。

您永远不要安装你的DLL,或第三方的DLL到\ SYSTEM32 \或\ SysWow64资料。如果你有静态加载,你把你的DLL在您的exe文件目录(在那里他们会被发现)。如果你无法预测的EXE目录(例如一些其他的EXE是要打电话给你的DLL),您可能需要把你的DLL目录到搜索路径(避免这种情况,如果在所有POSS!)

SYSTEM32和SysWow64资料是为Windows提供的文件... 不要为任何别人的文件即可。唯一的原因乡亲钻进把东西存在,因为它总是在搜索路径,和许多应用程序/模块使用静态链接的坏习惯。 (所以,如果你真的到它,真正的罪是静态链接 - 这是在本机代码罪和托管代码 - !永远永远永远动态链接)

遇到了同样的问题并研究了几分钟。

我被教导使用 Windows 3.1 和 DOS,还记得那些日子吗?不久之后,我严格使用 Macintosh 计算机一段时间,然后在购买了 x64 位计算机后开始回归 Windows。

这些变化背后有实际原因(有些人会说具有历史意义),这是程序员继续工作所必需的。

大多数变化如上所述:

  • Program FilesProgram Files (x86)

    最初,16/86 位文件是在“86”Intel 处理器上写入的。

  • System32 真正意思 System64 (在 64 位 Windows 上)

    当开发人员第一次开始使用 Windows7 时,存储其他应用程序时存在一些兼容性问题。

  • SysWOW64 真正意思 SysWOW32

    本质上,用简单的英语来说,这意味着 “64 位计算机上的 Windows 上的 Windows”. 。每个文件夹都指示应用程序希望使用它们的 DLL 所在的位置。

以下两个链接包含您需要的所有基本信息:

希望这能解决问题!

System32 是 Windows 历史上放置所有 32 位 DLL 的位置,而 System 则是放置 16 位 DLL 的位置。当微软创建 64 位操作系统时,我认识的每个人都希望这些文件位于 System64 下,但微软认为将 64 位文件放在 System32 下更有意义。我能找到的唯一理由是,他们希望 32 位的所有内容都可以在 64 位 Windows 上运行,而无需更改程序中的任何内容 - 只需重新编译,就可以了。他们解决这个问题的方法是创建一个名为 Windows32 On Windows64 的 32 位 Windows 子系统,以便 32 位应用程序仍然可以运行。因此,为 32 位子系统的 System 目录创建了缩写 SysWOW64。Sys 是 System 的缩写,WOW64 是 Windows32OnWindows64 的缩写。
由于 Windows 16 已经与 Windows 32 分离,因此不需要 Windows 16 On Windows 64 等效项。在 32 位子系统中,当程序要使用 system32 目录中的文件时,它们实际上是从 SysWOW64 目录中获取文件。但这个过程是有缺陷的。

这是一个可怕的设计。根据我的经验,为了编写 64 位应用程序,我必须做更多的更改,简单地将 System32 目录更改为读取 System64 将是一个非常小的更改,并且是预编译器指令旨在处理的更改。

其他人已经很好地解释了这个可笑的难题......我认为克里斯霍夫曼在这里做得更好: https://www.howtogeek.com/326509/whats-the-difference- Between-the-system32-and-syswow64-folders-in-windows/

我的两个想法:

  1. 我们在生活中都会犯一些愚蠢的短视错误。当微软将他们的(当时的)Win32 DLL 目录命名为“System32”时,这在当时是有意义的......他们只是没有考虑到如果/当他们的操作系统的 64 位(或 128 位)版本稍后开发时会发生什么 - 以及这样的目录名称会导致的大量向后兼容性问题。事后看来总是20-20,所以我不能因为这样的错误而责怪他们(太多)。...然而...当微软后来开发了他们的 64 位操作系统时,即使有事后诸葛亮的好处,为什么他们不仅会再次犯同样的短视错误,而且故意给它起这样一个误导性的名字,让事情变得更糟?! ?他们真丢人!!!为什么不至少将目录命名为“SysWin32OnWin64”以避免混淆?!?当他们最终生产出 128 位操作系统时会发生什么......那么他们要把 32 位、64 位和 128 位 DLL 放在哪里?!?

  2. 所有这些逻辑对我来说似乎仍然完全有缺陷。在 32 位版本的 Windows 上,System32 包含 32 位 DLL;在 64 位版本的 Windows 上,System32 包含 64 位 DLL ...这样开发人员就不必更改代码,对吗?这种逻辑的问题在于,这些开发人员要么现在正在制作需要 64 位 DLL 的 64 位应用程序,要么正在制作需要 32 位 DLL 的 32 位应用程序......不管怎样,他们不还是完蛋了吗?我的意思是,如果他们仍在制作 32 位应用程序,为了使其现在可以在 64 位 Windows 上运行,他们现在需要进行代码更改以查找/引用他们所使用的相同 ol' 32 位 DLL以前使用过(现在位于 SysWOW64 中)。或者,如果他们正在开发 64 位应用程序,那么他们无论如何都需要为新操作系统重新编写旧应用程序......所以无论如何都需要重新编译/重建!

微软有时会伤害我。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top