レジストリリフレクション
[このトピックの情報は、Windows Server 2008、Windows Vista、Windows Server 2003、および Windows XP に適用されます。 Windows 7 および Windows Server 2008 R2 以降では、WOW64 ではレジストリ リフレクションが使用されなくなり、以前に反映されていたキーが代わりに共有されます。 詳細については、「WOW64 の影響を受けるレジストリ キーの」を参照してください。
レジストリ リダイレクター は、WOW64 上のレジストリの特定の部分の個別の論理ビューを提供することで、32 ビットと 64 ビットのアプリケーションを分離します。 ただし、一部のレジストリ キーの値は、32 ビット ビューと 64 ビット ビューの両方で同じである必要があります。
レジストリ リフレクション プロセスでは、2 つのレジストリ ビュー間でレジストリ キーと値がコピーされ、同期が維持されます。 各ビューには、32 ビット レジストリ ビュー用と 64 ビット レジストリ ビュー用の各反映されたレジストリ キーの個別の物理コピーがあります。
RegCloseKeyを呼び出してキーを閉じると、反映されたキーコピーされます。 これにより、競合状態が発生する可能性があることに注意してください。複数のプロセスが反映されたキーを変更した場合、最後の RegCloseKey 呼び出しによってキーの最終的な値が決まります。
リフレクターは、ビュー間でローカル サーバーの COM アクティブ化データをコピーしますが、64 ビット Windows では 32/64 インプロセス データの混在が許可されていないため、インプロセス データはコピーされません。
リフレクションは、共有レジストリ キーまたはリダイレクトされないレジストリ キーでは有効になっていません。 たとえば、HKEY_LOCAL_MACHINE\System キーに対してリフレクションが有効になっていません。 リダイレクト、共有、または反映されるレジストリ キーの一覧については、「WOW64 の影響を受けるレジストリ キーを参照してください。
レジストリ リフレクションでは、次の例に示すように、"最後のライター優先" ポリシーが使用されます。
- 64 ビット Windows のクリーン インストール後、.doc ファイルを処理するために 64 ビット Wordpad.exe が登録されます。 リフレクターは、64 ビット レジストリ ビューから 32 ビット レジストリ ビューに.doc登録をコピーします。
- 管理者は 32 ビットの Office をインストールします。32 ビットの Winword.exe を登録して、32 ビット レジストリ ビューで.doc ファイルを処理します。 レジストリ リフレクターは、この情報を 64 ビット レジストリ ビューにコピーするため、32 ビット アプリケーションと 64 ビット アプリケーションの両方で、.doc ファイルの 32 ビット バージョンの Winword.exe が起動されます。
- 管理者が 64 ビットの Office をインストールします。64 ビットの Winword.exe を登録して、64 ビット レジストリ ビューで.doc ファイルを処理します。 レジストリ リフレクターは、この情報を 32 ビット レジストリにコピーするため、32 ビット アプリケーションと 64 ビット アプリケーションの両方で、.doc ファイルの 64 ビット バージョンの Winword.exe が起動されます。
したがって、ファイルの関連付け情報は、最近インストールされたアプリケーションに対して保持されます。
32 ビットおよび 64 ビット アプリケーションでは、通常は個別のレジストリ ビューに書き込まれる特定のレジストリ キー値を共有すると便利です。 たとえば、32 ビットクライアントと 64 ビット クライアントの両方からの要求を処理できる 32 ビット OLE サーバーでは、システム レジストリの 64 ビット ビューで 32 ビット レジストリ データを使用できます。
コンポーネントがシステム レジストリにデータを書き込むとき、WOW64 は情報を分析し、必要に応じてレジストリの代替ビューでデータのコピーを作成します。 通常、このプロセスは、レジストリ内の両方のビューに同じレジストリ キーの 2 つの個別の物理コピーを保持し、レジストリ リフレクションまたはレジストリ ミラーリングと呼ばれます。
クラス ルートの下のキーのほとんどは、このカテゴリに含まれています。 キーの更新は、更新が完了し、キーのハンドルが閉じると反映されます。 特定のケースでは、キーにビットの依存関係がある場合、キーへの書き込みが反映されません。 たとえば、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 は、64 ビット プロセスで実行するために 32 ビット DLL を読み込んだり、32 ビット プロセスで実行するために 64 ビット DLL を読み込んだりできないため、反映されません。
HKEY_LOCAL_MACHINE\Software\Classes\Appid と HKEY_CURRENT_USER\Software\Classes\Appidの場合、dllSurrogate と DllSurrogateExecutable レジストリ値が空の文字列の場合、その値は反映されません。
特定のリフレクション キーのレジストリ リフレクションを無効にして有効にするには、regDisableReflectionKeyを使用し、RegEnableReflectionKey関数します。 これらの関数は、このトピックの前半で反映されたキーの一覧にないキーには影響しません。 アプリケーションでは、作成するレジストリ キーに対してのみリフレクションを無効にし、HKEY_LOCAL_MACHINE や HKEY_CURRENT_USERなどの定義済みキーのリフレクションを無効にしないでください。 リフレクション リストのキーが無効になっているかどうかを確認するには、RegQueryReflectionKey 関数を使用します。
トランザクション レジストリ操作では、反映されたキーを使用しないでください。 トランザクション中に反映されたキーに書き込むと、トランザクションが失敗する可能性があります。 トランザクションの詳細については、「カーネル トランザクション マネージャーの を参照してください。
関連トピック
-
レジストリ リダイレクター の
-
Windows でのレジストリ リフレクションの
-
WOW64 の影響を受けるレジストリ キーの