[本主题中的信息适用于 Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP。 从 Windows 7 和 Windows Server 2008 R2 开始,WOW64 不再使用注册表反射,以前反映的密钥改为共享。 有关详细信息,请参阅 受 WOW64影响的注册表项。]
注册表重定向程序 通过在 WOW64 上提供注册表的某些部分的单独逻辑视图来隔离 32 位和 64 位应用程序。 但是,某些注册表项的值在 32 位和 64 位视图中必须相同。
注册表反射的过程 复制两个注册表视图之间的注册表项和值以使它们保持同步。 每个视图都有一个单独的物理副本,每个反映的注册表项,一个用于 32 位注册表视图,另一个用于 64 位注册表视图。
通过调用 RegCloseKey关闭密钥时,将复制反映的密钥。 请注意,这导致了可能的争用条件:如果多个进程更改了反映的键,则最后一个 RegCloseKey 调用决定了密钥的最终值。
反射器在视图之间复制本地服务器的 COM 激活数据,但它不会复制进程内数据,因为 64 位 Windows 上不允许使用 32/64 进程内数据混合。
未为共享注册表项或未重定向的注册表项启用反射。 例如,未为 HKEY_LOCAL_MACHINE\System 键启用反射。 有关重定向、共享或反映的注册表项列表,请参阅 受 WOW64影响的注册表项。
注册表反射使用“最后一个编写器胜出”策略,如以下示例所示:
- 安装 64 位 Windows 后,将注册 64 位 Wordpad.exe 来处理.doc文件。 反射器将.doc注册从 64 位注册表视图复制到 32 位注册表视图中。
- 管理员安装 32 位 Office,该 Office 注册 32 位 Winword.exe 以在 32 位注册表视图中处理.doc文件。 注册表反射器将此信息复制到 64 位注册表视图中,因此 32 位和 64 位应用程序都针对.doc文件启动 32 位版本的 Winword.exe。
- 管理员安装 64 位 Office,该 Office 注册 64 位 Winword.exe 以在 64 位注册表视图中处理.doc文件。 注册表反射器将此信息复制到 32 位注册表中,因此 32 位和 64 位应用程序都为 .doc 文件启动 64 位版本的 Winword.exe。
因此,为最近安装的应用程序保留文件关联信息。
它可用于 32 位和 64 位应用程序共享通常写入到单独的注册表视图的特定注册表项值。 例如,一个 32 位 OLE 服务器,可为来自 32 位和 64 位客户端的请求提供服务,其 32 位注册表数据可用于系统注册表的 64 位视图。
当组件在系统注册表中写入数据时,WOW64 会分析信息,并在适当时在注册表的备用视图中复制数据。 通常,此过程在注册表的两个视图中保留相同注册表项的两个单独的物理副本,称为注册表反射或注册表镜像。
类根下的大多数键都属于此类别。 当更新完成并且密钥句柄关闭时,将反映对密钥的更新。 在特定情况下,如果密钥具有某种位依赖关系,则不会反映对密钥的写入。 例如,32 位 InprocServer32 键与 64 位应用程序无关,因此 InprocServer32 键不会反映在 64 位注册表视图中。 但是,64 位应用程序可以使用 32 位 LocalServer32 密钥,并反映 LocalServer32 密钥。
对于 HKEY_LOCAL_MACHINE\Software\Classes\CLSID 和 HKEY_CURRENT_USER\Software\Classes\CLSID,仅反映未指定 InprocServer32 或 InprocHandler32 的 CLSID。 仅反映 LocalServer32 CLSID,因为它们进程不足,并且可由 32 位或 64 位应用程序激活。 InProcServer32 CLSID 不会反映,因为无法加载 32 位 DLL 以便在 64 位进程中执行,也不能加载 64 位 DLL,以便在 32 位进程中执行。
对于 HKEY_LOCAL_MACHINE\Software\Classes\Appid 和 HKEY_CURRENT_USER\Software\Classes\Appid,DllSurrogate 和 DllSurrogateExecutable 注册表值在值为空字符串时不会反映。
若要禁用和启用特定反射项的注册表反射,请使用 RegDisableReflectionKey 和 RegEnableReflectionKey 函数。 这些函数不会影响本主题前面反映的键列表中的键。 应用程序应仅禁用它们创建的注册表项的反射,而不应尝试禁用预定义键(如 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER)的反射。 若要确定反射列表中的键是否已禁用,请使用 RegQueryReflectionKey 函数。
在事务处理注册表作中不应使用反映的键。 写入事务期间反映的密钥可能会导致事务失败。 有关事务的详细信息,请参阅 内核事务管理器。
相关主题