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


227

我想知道我们什么时候需要在下面放置文件

在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

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


2
同样,这是:Windows在当前工作目录以及系统PATH中查找。没有其他方式可以指定。哦,等等。您可以将搜索路径嵌入DLL中。它是一个8字节长的字段。是。8个字符。
Jeroen Baert 2012年

在Windows 7上似乎不是这样。在system32文件中的DLL上运行文件C:\ Windows \ system32 \ user32.dll C:\ Windows \ system32 \ user32.dll; 适用于MS Windows(DLL)(GUI)的PE32可执行文件Intel 80386 32位,但对于64位DLL,它将打印适用于MS Windows(DLL)的PE32 +可执行文件(控制台)Mono / .Net程序集请注意,该DLL 不是 .Net部件。它是本机DLL。
user877329 2013年


11
前Microsoftie的采访。(有关此操作的详细说明,请参见此答案。)
Tgr 2014年

superuser.com/a/157301/241386 “向后兼容的原因。很多应用程序假设它们不应该假设的事情并使用硬编码路径”
phuclv 2015年

Answers:


225

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

SysWoW64不适用于64位系统的dll,它实际上类似于“ Windows on Windows64”,这意味着在64位Windows上运行32位应用程序所需的位。

本文介绍了一下:

“ Windows x64的目录System32包含64位DLL(如此!)。因此,位数为64的本机进程在其期望的位置找到“其” DLL:在System32文件夹中。第二个目录SysWOW64包含32个文件系统重定向器神奇地隐藏了32位进程的真实System32目录,并在System32名称下显示SysWOW64。”

编辑:如果您正在谈论安装程序,那么您实际上不应该对系统文件夹的路径进行硬编码。取而代之的是,让Windows根据您的安装程序是否在仿真层上运行为您服务。


27
gh,我今天遇到了这种怪异现象。他们所做的事情真是令人误解。
安迪·怀特

16
今天也碰到了这个问题...太令人困惑了-Glut 32位dll进入/ SysWOW64,Glut 64位dll进入/ System32。有人应该写下来。在网上。
Jeroen Baert

8
好消息是,作为Microsoft工程天才的一个例子,这几乎是自我记录。
Spike0xff

8
我没有得到的一件事是,如果文件系统可以告诉它它是一个32位应用程序并将其重定向到SysWOW64文件夹,为什么他们为什么不能让它检测到64位应用程序并重定向到一个System64
科尔·约翰逊

6
System32是Windows 32位版本的系统DLL。系统是16位版本。在64位操作系统上运行时,向我们提供Windows 8的同一家公司为我们提供了用于32位DLL的SysWow64和用于64位DLL的System32。在64位系统中,System文件夹仍然是旧的16位垃圾邮件,仅System32不是建议的32位,而32位的内容位于System目录中,名称为64。我看不出这对任何人都有帮助。它使事情变得复杂,并破坏了一切。所有这些都可以避免人们在转换为64位时将硬编码的“ System32”更改为“ System64”。愚蠢
Armand

26

我应该补充:无论如何,您都不应该将dll放入\ system32 \!修改您的代码,修改您的安装程序...在c:\ windows \下找到您的存放位置

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

\program files\<your app dir>\

or

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

注意您实际执行此操作的方法是使用环境var:%ProgramFiles%或%ProgramFiles(x86)%查找Program Files的位置。 ..)

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

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

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

以上是明智的做法。

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

system32和syswow64适用于Windows提供的文件... 不适用于其他人的文件。人们习惯于将东西放在那里的坏习惯的唯一原因是,它总是在搜索路径中,并且许多应用程序/模块都使用静态链接。(因此,如果您真正了解它,真正的缺点就是静态链接-这是本机代码和托管代码中的缺点-始终始终总是动态链接!)


9
+1 ...但我要补充一点,您应该使用%PROGRAMFILES%之类的变量而不是\ Program Files \
Rod MacPherson

在XP时代,对于开发人员而言,使用注册表进行此类操作是一种常见(建议的做法)。在Windows 7中,这不再是事实!出于UAC,多个用户会话等原因。开发人员应谨慎使用Windows 7中的注册表。
ryyker 2014年

@RodMacPherson我的回答得到了增强,可以考虑您的建议。你说得对!
Jonesome恢复Monica 2014年

经过一番考虑,我认为这可以更好地回答问题-“何时需要将文件放在%SYSTEMROOT%下”。决不。这个答案不能满足人们对syswow64文件夹的好奇心,但这是开发人员真正需要阅读的内容。
汤玛斯(Thomas)

7

遇到相同的问题并对此进行了几分钟的研究。

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

这些更改背后有一些实际原因(有些人会说具有历史意义),这对于程序员继续工作是必要的。

上面提到了大多数更改:

  • Program FilesProgram Files (x86)

    最初,16/86位文件是在“ 86”英特尔处理器上编写的。

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

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

  • SysWOW64 真正意思 SysWOW32

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

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

希望这可以清除一切!


4
如果要认真对待,您可能应该降低should语的语调并改善语法。另外,您可能想更多地构造答案,使用段落。
Klas Mellbourn

2
@Crispy清理了答案。将来,您应该考虑Klas的建议,并设定回应的格式,以增加投票的机会。:)
RekindledPhoenix

OP需要完全重写,甚至删除。它具有误导性,并没有真正的用处。
Jonesome恢复莫妮卡

5
SysWOW64实际上代表:[Sys] tem [W] indows 32-bit [o] n [W] indows [64] -bit,因此缩写为SysWoW64(这实际上没有任何意义,而Microsoft只是将System32留给了32bit的东西。 ,并创建了System64,实际上不会有兼容性问题,Microsoft在WoW沙箱中所做的就是创建一个内存中重定向,以对SysWoW64的请求作为对System32的从32位访问的访问。原始文件中的文件系统是否需要为不同的平台神奇地重新映射它?如先前的评论-Idiocy所述
Armand

1
答案带来的误解多于对问题的澄清,Armands的评论是很好的解释。
nahab

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 16与Windows 64等效。在32位子系统中,当程序使用system32目录中的文件时,它们实际上是从SysWOW64目录中获取文件的。但是这个过程是有缺陷的。

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


2

其他人已经很好地解释了这个ridiculus难题……我认为克里斯·霍夫曼在这里做得更好:https://www.howtogeek.com/326509/whats-the-difference-between-the- Windows中的system32和syswow64文件夹/

我的两个想法:

  1. 我们每个人在生活中都会犯愚蠢的短视错误。当微软将他们当时的Win32 DLL目录命名为“ System32”时,这在当时是有意义的……他们只是没有考虑到64位(或128位)版本时的情况。他们的OS后来才开发出来-这样的目录名会引起大量的向后兼容性问题。后见之明总是20到20,所以我不能为这样的错误真正责怪他们(太多)。...但是...当微软后来开发了64位操作系统时,即使有了事后的见解,为什么呢?为什么他们不仅会再次犯完全相同的近视错误,而且会因目的不当而使情况变得更糟这样一个令人误解的名字?!?他们真丢人!!!为什么不至少将目录实际命名为“ SysWin32OnWin64”以避免混淆??当他们最终生产128位OS时会发生什么……然后将32位,64位和128位DLL放在哪里?!

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

微软有时会伤害我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.