44

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

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

4

6 回答 6

59

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

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

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX

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

于 2009-05-15T17:13:26.443 回答
7

你的理解是正确的。x64 应用程序不需要访问 x86 CLSID,因为它永远无法加载这些组件,反之亦然。

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

或者,为任何 CPU 架构都可以使用的任何 CPU 构建 .NET 程序集。

于 2009-05-15T17:05:23.623 回答
4

它们不是单独的注册表——一个是另一个的子节点,操作系统进行虚拟化以确保 32 位应用程序获取它们的密钥,而 64 位应用程序获取它们的密钥。

于 2009-05-15T17:07:29.530 回答
1

我运行 x64 位机器作为我的桌面;而且我从未遇到过不同注册表配置的任何问题。

根据 MSDN,显然存在差异: http: //msdn.microsoft.com/en-us/library/ms724072 (VS.85).aspx

高温高压

于 2009-05-15T17:03:41.270 回答
1

这是 WOW64 注册表上的 Wikipedia 文章,它可能会为您提供一些您正在寻找的信息:

http://en.wikipedia.org/wiki/WOW64

于 2009-05-15T17:03:57.917 回答
1

如何注册 .NET 程序集以在纯 64 位应用程序中用作 COM?

问题: 默认情况下,如果您在构建设置中启用“注册 COM 互操作”,它不会为 64 位注册类型库。

解决方案: 要在 64 位机器上注册不在 GAC 中的程序集,请打开 cmd 窗口并执行以下操作:

cd c:\windows\microsoft.net\framework64\v2.x.xxxxx
regasm /codebase "path to your compiled assembly dll"

当使用本机 C++ 将 .NET 程序集实例化为 COM 对象时,这将消除“类未注册错误”。

于 2009-06-09T15:01:39.610 回答