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

为什么64位DLL要转到System32,而32位DLL要转到64位Windows上的SysWoW64?,dll,32bit-64bit,system32,syswow64,Dll,32bit 64bit,System32,Syswow64,我想知道我们什么时候需要把文件放在 C:\Windows\System32或C:\Windows\SysWOW64,在64位Windows系统上 我有两个DLL,一个用于32位,一个用于64位 从逻辑上讲,我认为应该将32位DLL放在C:\Windows\System32下,将64位DLL放在C:\Windows\SysWOW64下 令我惊讶的是,情况正好相反!32位的DLL进入C:\Windows\SysWOW64,而64位的DLL进入C:\Windows\System32 非常令人困惑的东西

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

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

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

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

令我惊讶的是,情况正好相反!32位的DLL进入C:\Windows\SysWOW64,而64位的DLL进入C:\Windows\System32


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

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

SysWoW64不适用于64位系统的DLL,它实际上类似于“Windows64上的Windows”,即在64位Windows上运行32位应用程序所需的位

解释一下:

Windows x64有一个包含64位DLL(原文如此!)的目录System32。因此位为64的本机进程可以找到“它们的”DLL的预期位置:在System32文件夹中。第二个目录SysWOW64包含32位DLL。文件系统重定向器的神奇之处在于为32位进程隐藏真正的System32目录,并以System32的名称显示SysWOW64。”


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

我应该补充:无论如何,您不应该将dll放入\system32\中!修改您的代码,修改您的安装程序。。。为你的比特找一个不在c:\windows下的家\

例如,安装程序将DLL放入:

\program files\<your app dir>\

or

\program files\common files\<your app name>\
\程序文件\\
或
\程序文件\通用文件\\
注意:实际执行此操作的方法是使用环境变量:%ProgramFiles%或 %ProgramFiles(x86)%to查找程序文件所在的位置…您不认为它是c:\Program Files\…)

然后设置注册表标记:

HKLM\software\<your app name>
-- dllLocation
HKLM\software\
--分配
使用DLL的代码读取注册表,然后动态链接到该位置的DLL

以上是明智的做法

您从未将DLL或第三方DLL安装到\system32\或\syswow64中。如果必须静态加载,请将DLL放在exe目录中(可以在那里找到它们)。如果无法预测exe目录(例如,其他一些exe将调用您的dll),则可能必须将dll目录放入搜索路径(如果有可能,请避免此操作!)


system32和syswow64用于Windows提供的文件不适用于任何其他人的文件。人们养成把东西放在那里的坏习惯的唯一原因是,它总是在搜索路径中,而且许多应用程序/模块使用静态链接。(因此,如果你真的认真考虑一下,真正的问题是静态链接——这是本机代码和托管代码中的一个问题——总是动态链接!)

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

我被教导使用Windows3.1和DOS,还记得那些日子吗?在我严格使用Macintosh电脑一段时间后不久,在买了一台x64位的机器后,我开始转向Windows

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

以上提到了大部分变化:

  • 程序文件
    vs
    程序文件(x86)

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

  • 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中工作,而不需要改变程序中的任何东西——只要重新编译,就可以了。他们解决这个问题的方法是在Windows64上创建一个名为Windows32的32位windows子系统,这样32位应用程序仍然可以运行。因此,为32位子系统的系统目录创建了缩写词SysWOW64。Sys是System的缩写,WOW64是Windows32OnWindows64的缩写。
由于windows 16已与windows 32隔离,因此不需要windows 16与windows 64对等。在32位子系统中,当程序使用system32目录中的文件时,它们实际上从SysWOW64目录中获取文件。但这一过程是有缺陷的


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

其他人已经很好地解释了这个可笑的难题。。。我认为克里斯·霍夫曼在这里做得更好:

我的两个t