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

我想知道我们什么时候需要放置一个文件 在64位Windows系统上的C: Windows System32或C: Windows SysWOW64。 我有两个DLL,一个用于32位,一个用于64位。 逻辑上,我以为我将32位DLL放在C: Windows System32下,将64位DLL放在C: Windows SysWOW64下。 令我惊讶的是,这是相反的方式! 32位进入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 -bit DLL。文件系统重定向器为32位进程隐藏真实的System32目录并以System32的名称显示SysWOW64。 编辑:如果您正在谈论安装程序,您真的不应该硬编码系统文件夹的路径。相反,让Windows根据您的安装程序是否在仿真层上运行来为您处理它。     
我应该补充一点:你不应该把你的dll放到 system32 中!修改你的代码,修改你的安装程序......找到一个不在c: windows下的任何位置的主页 例如,您的安装程序将您的dll放入:
program files<your app dir>

or

program filescommon files<your app name>
(注意:实际执行此操作的方法是使用环境var:%ProgramFiles%或 %ProgramFiles(x86)%来查找Program Files的位置....你不认为它是c: program files ....) 然后设置一个注册表标签:
HKLMsoftware<your app name>
-- dllLocation
使用您的dll的代码读取注册表,然后动态链接到该位置的dll。 以上是明智之举。 您永远不会将您的dll或第三方dll安装到 system32 或 syswow64中。如果你必须静态加载,你将你的dll放在exe目录中(它们将被发现)。如果你无法预测exe目录(例如某些其他exe会调用你的dll),你可能必须将你的dll目录放入搜索路径(如果可能的话,请避免这样做!) system32和syswow64用于Windows提供的文件...不适用于任何人的elses文件。人们养成放东西的坏习惯的唯一原因是因为它总是在搜索路径中,并且许多应用程序/模块使用静态链接。 (所以,如果你真的了解它,真正的罪恶是静态链接 - 这是本机代码和托管代码中的罪 - 始终总是动态链接!)     
进入相同的问题并研究了几分钟。 我被教导使用Windows 3.1和DOS,还记得那些日子吗?在我使用Macintosh计算机一段时间之后不久,在购买x64位机器后开始回到Windows。 这些变化背后的实际原因(有些人会说具有历史意义)是程序员继续工作所必需的。 大多数变化如上所述:
Program Files
Program Files (x86)
最初,16 / 86bit文件是在'86'英特尔处理器上写的。
System32
真的意味着
System64
(在64位Windows上) 当开发人员第一次开始使用Windows7时,存在一些兼容性问题,其中存储了其他应用程序。
SysWOW64
真的意味着
SysWOW32
基本上,用简单的英语,它意味着“在64位机器上的Windows上的Windows”。每个文件夹指示DLL所在的应用程序所在的位置。 以下是两个链接,其中包含您需要的所有基本信息: MSDN文件系统重定向器 SysWow64解释 希望这可以解决问题!     
System32是Windows历史上放置所有32位DLL的地方,而System是16位DLL。当微软创建64位操作系统时,我所知道的每个人都希望文件驻留在System64下,但微软认为将64位文件放在System32下更有意义。我能找到的唯一理由是,他们希望32位的所有内容都能在64位Windows中工作,而不必更改程序中的任何内容 - 只需重新编译即可完成。他们解决这个问题的方式,即32位应用程序仍然可以运行,就是在Windows64上创建一个名为Windows32的32位Windows子系统。因此,首字母缩写词SysWOW64是为32位子系统的System目录创建的。 Sys是System的缩写,WOW64是Windows32OnWindows64的缩写。 由于Windows 16已经与Windows 32隔离,因此不需要Windows 16 On Windows 64等效。在32位子系统中,当程序使用system32目录中的文件时,它们实际上从SysWOW64目录中获取文件。但这个过程是有缺陷的。 这是一个可怕的设计。根据我的经验,我不得不为编写64位应​​用程序做了很多更改,只需将System32目录更改为读取System64将是一个非常小的更改,并且预编译器指令将用于处理。     

要回复问题请先登录注册