为什么64位DLL在64位Windows上进入System32和32位DLL到SysWoW64?

Gan*_*ved 219 dll system32 syswow64 32bit-64bit

我想知道我们什么时候需要放置一个文件

在64位Windows系统上的C:\ Windows\System32或C:\ Windows\SysWOW64.

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

逻辑上,我以为我将32位DLL放在C:\ Windows\System32下,将64位DLL放在C:\ Windows\SysWOW64下.

令我惊讶的是,这是相反的方式!的32位一个进入C:\的Windows\SYSWOW 64,和64位DLL进入C:\的Windows \系统32.

很混乱的东西.这背后的原因是什么?

Ryt*_*mis 218

我认为目的是重命名System32,但是有很多应用程序为该路径进行了硬编码,因此删除它是不可行的.

SysWoW64不适用于64位系统的dll,它实际上类似于"Windows64上的Windows",这意味着你需要在64位Windows上运行32位应用程序.

这篇文章解释了一下:

"Windows x64有一个包含64位DLL的目录System32(原文如此!).因此,位数为64的本机进程找到他们期望的"他们的"DLL:在System32文件夹中.第二个目录,SysWOW64,包含32 -bit DLL.文件系统重定向器为32位进程隐藏真实的System32目录并以System32的名称显示SysWOW64.

编辑:如果您正在谈论安装程序,您真的不应该硬编码系统文件夹的路径.相反,让Windows根据您的安装程序是否在仿真层上运行来为您处理.

  • 呃,我今天刚遇到这种奇怪的现象.他们做了多么误导的事情. (27认同)
  • 今天也进入这个......太混乱了 - Glut 32位dll进入/ SysWOW64,Glut 64位dll进入/ System32.有人应该写下来.在网上. (16认同)
  • 好消息是,作为微软工程天才的一个例子,这几乎是自我记录的. (7认同)
  • 我没有得到的一件事是,如果文件系统可以告诉它是一个32位应用程序并将其重定向到`SysWOW64`文件夹,为什么他们不能让它检测到64位应用程序并重定向到`System64 `?! (7认同)
  • System32是Windows 32位版本的系统DLL.系统是16位版本.给我们Windows 8的同一家公司在64位操作系统上运行时,为32位DLL提供了SysWow64,为64位DLL提供了System32.在64位系统中,System文件夹仍然是旧的16位垃圾,只有System32不是建议的32位,32位的东西在系统目录中,名称中有64位.我没有看到这对任何人都有帮助.它使事情复杂化,并打破一切.所有这些都是为了避免人们在转换为64位时将硬编码的"System32"改编为"System64".白痴 (5认同)
  • 有趣的是,我还没有看到一个这样的例子以任何方式影响我的生活.然而,即使我没有操作系统开发经验,也能够形成一种猜想,其中当前的做事方式具有某种意义.如果你是微软,我猜你不会赢.更改文件夹名称 - >应用程序中断 - > Windows糟透了!不要改变它 - >命名有些不一致 - >微软是白痴! (4认同)
  • 具有讽刺意味的是,你刚刚做了,这个帖子现在是谷歌"SysWOW64 32bits"的顶级链接,所以...... (2认同)
  • 我不知道,但它可能像性能一样简单 - 假设系统本身是64位,系统组件是64位,大多数应用程序也应该是64位.对64位应用程序进行重定向会导致在最常见的情况下而不是异常中出现性能损失. (2认同)
  • 这几乎和跳过 Windows 9 一样糟糕,因为人们正在从 Windows 95、98 等 Windows 版本的版本字符串中检查 Windows 9*。老实说,他们应该重定向旧应用程序的系统调用,所以这不是问题而不是混淆目录名称和跳过版本(甚至将路径更改为正确的路径等)。不要成为自己工作的奴隶。System32 应该只用于 32 位的东西。 (2认同)

Jon*_*ica 26

我应该补充一点:你不应该把你的dll放到\ system32 \中!修改你的代码,修改你的安装程序......找到一个不在c:\ windows下的位的家

例如,您的安装程序将您的dll放入:

\program files\<your app dir>\

or

\program files\common files\<your app name>\
Run Code Online (Sandbox Code Playgroud)

(注意:实际执行此操作的方法是使用环境var:%ProgramFiles%或%ProgramFiles(x86)%来查找Program Files的位置....您不认为它是c:\ program files\.. ..)

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

HKLM\software\<your app name>
-- dllLocation
Run Code Online (Sandbox Code Playgroud)

使用您的dll的代码读取注册表,然后动态链接到该位置的dll.

以上是明智之举.

您永远不会将您的dll或第三方dll安装到\ system32 \或\ syswow64中.如果你必须静态加载,你将你的dll放在你的exe目录(他们将被发现的地方).如果你无法预测exe目录(例如某些其他exe会调用你的dll),你可能必须将你的dll dir放入搜索路径(如果可能的话,请避免这样做!)

system32和syswow64用于Windows提供的文件... 不适用于任何人的elses文件.人们养成放东西的坏习惯的唯一原因是因为它总是在搜索路径中,并且许多应用程序/模块使用静态链接.(所以,如果你真的了解它,真正的罪恶是静态链接 - 这是本机代码和托管代码中的罪 - 总是总是动态链接!)

  • +1 ...但我补充说你应该使用像%PROGRAMFILES%这样的变量而不是\ Program Files \ (9认同)

小智 7

进入相同的问题并研究了几分钟.

我被教导使用Windows 3.1和DOS,记得那些日子?在我使用Macintosh计算机一段时间之后不久,在购买x64位机器后开始摇摆回到Windows.

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

大多数变化如上所述:

  • Program Files VS Program Files (x86)

    最初,16/86bit文件是在'86'英特尔处理器上写的.

  • System32真的意味着System64(在64位Windows上)

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

  • SysWOW64 真正意思 SysWOW32

    基本上,用简单的英语,它意味着"在64位机器上的Windows上的Windows".每个文件夹指示DLL所在的应用程序所在的位置.

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

希望这能搞定!

  • SysWOW64实际上代表:[系统] tem [W] indows 32位[o] n [W] indows [64] -bit因此缩写形式SysWoW64(这真的没有意义,并且微软刚刚离开System32用于32位的东西并且创建了一个System64,确实不存在兼容性问题.微软在WoW沙箱中做的是创建内存重定向从32位访问System32作为对SysWoW64的请求......这怎么不比暴露更复杂原始w/o中的文件系统必须为不同平台神奇地重新映射它?正如先前评论中所述 - Idiocy. (5认同)
  • 如果你想被认真对待,你应该调低俚语并改善语法.此外,您可能希望更多地构建您的答案,使用段落. (4认同)
  • @Crispy清理了答案。将来,您应该考虑Klas的建议,并设定回应的格式,以增加投票的机会。:) (2认同)

Arm*_*and 5

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

这是一个可怕的设计。以我的经验,我不得不对编写64位应​​用程序进行很多更改,仅更改System32目录以读取System64就是一个很小的更改,并且预编译指令旨在处理该更改。