Windows 64位注册表与32位注册表

Geo*_*ge2 41 com registry 64-bit x86 clsid

我听说在Windows x64架构上,为了支持运行x86和x64应用程序,有两个独立/不同的Windows注册表集 - 一个用于x86应用程序访问,另一个用于x64应用程序访问?例如,如果COM在x86注册表集中注册CLSID,那么x64应用程序永远无法通过CLSID访问COM组件,因为x86/x64具有不同的注册表集?

所以,我的问题是我对上述样本的理解是否正确?我还想获得更多文档来学习这个主题,关于x64架构上的两个不同的注册表集.(我做了一些搜索,但没有找到任何有价值的信息.)

17 *_* 26 57

我不久前遇到了这个问题.简短的回答是,如果您在64位计算机上运行32位应用程序,那么它的注册表项位于Wow6432Node下.

例如,假设您有一个应用程序将其注册表信息存储在:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX
Run Code Online (Sandbox Code Playgroud)

如果将应用程序编译为64位二进制文​​件并在64位计算机上运行,​​则注册表项位于上面的位置.但是,如果您将应用程序编译为32位二进制文​​件并在64位计算机上运行,​​那么您的注册表信息现在位于此处:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX
Run Code Online (Sandbox Code Playgroud)

这意味着如果您在同一台计算机上同时运行32位和64位版本的应用程序,那么它们将分别查看一组不同的注册表项.

  • 在64位计算机上有两个版本的regsrv32.一个在Wow6432节点中注册64位二进制文​​件和一个寄存器32位二进制文​​件.这篇Microsoft kb文章可能对您有所帮助:http://support.microsoft.com/kb/282747 (7认同)
  • 一个简单的问题,如果我使用regsvr32注册COM组件,我们如何知道我们是否在x86或x64注册表下注册?我的ocnfusion是,如果在x86注册表下注册,x64应用程序将无法访问COM组件? (2认同)

Ant*_*nes 7

你的理解是正确的.不需要x64应用程序来访问x86 CLSID,因为它无论如何都不会加载这些组件,反之亦然.

如果要创建供x86和x64使用的组件,则需要创建一对为x86构建的dll,另一个为x64,并在注册表的相应部分中注册.System32文件夹中的regsrv32.exe将反常注册x64组件,SysWOW64文件夹中的regsrv32.exe将注册x86组件.

或者为任何CPU架构使用的任何CPU构建.NET程序集.

  • 在这种情况下,它不是 JIT 或 .NET 决定要查找 CLSID 的注册表的哪一部分,因为代码运行的进程是 64 位的,这决定了它将使用哪个集合来查找 CLSID。这是在 Windows 中安装的 COM 支持库中自动发生的事情。 (2认同)