レジストリリダイレクタは、WOW64上のレジストリの特定部分の個別の論理ビューを提供することにより、32ビットアプリケーションと64ビットアプリケーションを分離します。ただし、一部のレジストリキーの値は、32ビットビューと64ビットビューの両方で同じである必要があります。
レジストリリフレクションのプロセスでは、2つのレジストリビュー間でレジストリキーと値をコピーして、それらの同期を維持します。各ビューには、反映された各レジストリキーの個別の物理コピーがあり、1つは32ビットレジストリビュー用、もう1つは64ビットレジストリビュー用です。
RegCloseKeyを呼び出してキーを閉じると、反映されたキーがコピーされます。これにより、競合状態が発生する可能性があることに注意してください。複数のプロセスが反映されたキーを変更した場合、最後のRegCloseKey呼び出しがキーの最終値を決定します。
リフレクターは、ビュー間でローカルサーバーのCOMアクティベーションデータをコピーしますが、64ビットWindowsでは32/64インプロセスデータの混合が許可されていないため、インプロセスデータはコピーしません。
リフレクションは、共有レジストリキーまたはリダイレクトされないレジストリキーでは有効になっていません。たとえば、HKEY_LOCAL_MACHINE \ Systemキーのリフレクションは有効になっていません。リダイレクト、共有、または反映されるレジストリキーの一覧については、「WOW64の影響を受けるレジストリキー」を参照してください。
レジストリリフレクションは、次の例に示すように、「最後の書き込み優先」ポリシーを使用します。
- 64ビットWindowsのクリーンインストール後、64ビットWordpad.exeが.docファイルを処理するために登録されます。リフレクターは、64ビットレジストリビューから32ビットレジストリビューに.doc登録をコピーします。
- 管理者は32ビットのOfficeをインストールし、32ビットのレジストリビューで.docファイルを処理するために32ビットのWinword.exeを登録します。レジストリリフレクターはこの情報を64ビットのレジストリビューにコピーするため、32ビットと64ビットの両方のアプリケーションが.docファイルに対して32ビットバージョンのWinword.exeを起動します。
- 管理者が64ビットの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のみが反映されます。プロセス外で実行され、32ビットまたは64ビットアプリケーションでアクティブ化できるため、LocalServer32 CLSIDのみが反映されます。 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関数を使用します。
反映されたキーは、トランザクションレジストリ操作では使用しないでください。トランザクション中に反映されたキーに書き込むと、トランザクションが失敗する可能性があります。トランザクションの詳細については、カーネルトランザクションマネージャーを参照してください。
関連トピック