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

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

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

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

从逻辑上讲,我以为我会把C:\ Windows \ System32下的32位DLL和C:\ Windows \ SysWOW64下的64位DLL。

令我惊讶的是,这是相反的方式32位的进入C:\ Windows \ SysWOW 64 ,而64位的DLL进入C:\ Windows \ System 32

非常混乱的东西。 这背后的原因是什么?

我相信其意图是重命名System32,但是这么多的应用程序硬编码的path,它是不可行的,以消除它。

SysWoW64不适用于64位系统的dll,它实际上就是“Windows64上的Windows”,意思是在64位窗口上运行32位应用程序所需的位。

这篇文章解释了一下:

“Windows x64有一个包含64位DLL(sic!)的System32目录,因此64位的本机进程在”System32“文件夹中find”他们“的DLL:System32文件夹第二个目录SysWOW64包含32位文件系统DLL文件系统redirect程序隐藏真正的System32目录为32位进程和显示SysWOW64的System32名称。

编辑:如果你正在谈论一个安装程序,你真的应该硬编码到系统文件夹的path。 而是让Windows根据您的安装程序是否在仿真层上运行来处理它。

我应该补充:你不应该把你的dll放到\ system32 \中! 修改你的代码,修改你的安装程序…find你的位置不在c:\ windows \

例如,你的安装程序把你的DLL放入:

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

注意实际执行此操作的方式是使用环境variables%ProgramFiles%或%ProgramFiles(x86)%来查找程序文件的位置….您不认为它是c:\ program files \ .. ..)

然后设置一个registry标记:

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

使用你的dll的代码读取registry,然后dynamic链接到该位置的dll。

以上是明智之路。

您不会将您的dll或第三方dll安装到\ system32 \或\ syswow64中。 如果你必须静态加载,你把你的DLL在你的EXE目录(他们将被发现)。 如果你不能预测exe目录(例如一些其他exe将打电话给你的DLL),你可能不得不把你的dll目录进入searchpath(如果在所有位置避免这个!)

system32和syswow64是Windows提供的文件… 不适用于任何人elses文件 。 人们陷入坏习惯的唯一原因是因为它总是在searchpath中,许多应用程序/模块使用静态链接。 (所以,如果你真的了解它,真正的罪恶是静态链接 – 这是在本机代码和托pipe代码中的罪过 – 始终总是dynamic链接!)

跑到同一个问题,并研究了几分钟。

我被教导使用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所在的应用程序所在的位置。

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

  • MSDN文件系统redirect器

  • SysWow64解释

希望这清除了事情!

System32是Windows历史上放置所有32位DLL的地方,系统是16位的DLL。 当微软创build了64位操作系统,我所知道的每个人都希望这些文件位于System64下,但是微软决定将64位文件放在System32下更有意义。 我唯一能find的理由是,他们希望所有的32位工作在64位的Windows上,而不必改变程序中的任何东西 – 只需重新编译即可。 他们解决这个问题的方式,使32位应用程序仍然可以运行,就是在Windows64上创build一个名为Windows32的32位Windows子系统。 因此,首字母缩写SysWOW64是为32位子系统的系统目录创build的。 Sys是System的简称,WOW64是Windows32OnWindows64的缩写。
由于Windows 16已经与Windows 32分离,所以不需要Windows 64在Windows 64等价。 在32位子系统中,当程序使用system32目录中的文件时,他们实际上从SysWOW64目录中获取文件。 但是这个过程是有缺陷的。

这是一个可怕的devise。 根据我的经验,为了编写64位应​​用程序,我必须进行更多的更改,只是简单地将System32目录更改为读取System64将只是一个非常小的更改,而预编译器指令是要处理的。

Interesting Posts