レジストリ リフレクション
[このトピックの情報は、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 をインストールします。この Office では、32 ビット レジストリ ビューで.doc ファイルを処理する 32 ビット Winword.exeが登録されます。 レジストリ リフレクターは、この情報を 64 ビット レジストリ ビューにコピーするため、32 ビットアプリケーションと 64 ビット アプリケーションの両方で、.doc ファイルの 32 ビット バージョンのWinword.exeが起動されます。
- 管理者は 64 ビット版の Office をインストールします。この Office では、64 ビット のレジストリ ビューで.docファイルを処理する 64 ビット Winword.exeが登録されます。 レジストリ リフレクターは、この情報を 32 ビット レジストリにコピーするため、32 ビット アプリケーションと 64 ビット アプリケーションの両方で、.doc ファイルの 64 ビット バージョンのWinword.exeが起動されます。
したがって、ファイルの関連付け情報は、最後にインストールされたアプリケーションに対して保持されます。
32 ビットと 64 ビットのアプリケーションでは、通常は個別のレジストリ ビューに書き込まれる特定のレジストリ キー値を共有すると便利です。 たとえば、32 ビット クライアントと 64 ビット クライアントの両方からの要求を処理できる 32 ビット OLE サーバーでは、32 ビットレジストリ データをシステム レジストリの 64 ビット ビューで使用できます。
コンポーネントがシステム レジストリにデータを書き込むと、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 関数を使用します。
トランザクション レジストリ操作では、反映されたキーを使用しないでください。 トランザクション中に反映されたキーに書き込むと、トランザクションが失敗する可能性があります。 トランザクションの詳細については、「 カーネル トランザクション マネージャー」を参照してください。
関連トピック