32 ビット アプリケーションと 64 ビット アプリケーションのレジストリ キーは分離されているため、32 ビット アプリケーションから 64 ビット レジストリに (直接) アクセスすることはできません。あなたの場合、必要なハイブがレジストリの 32 ビット部分に存在しない場合、親フォルダーにのみアクセスできます。
MSDN から:
64 ビット Windows では、アプリケーションの 64 ビット バージョンが32 ビット バージョンとは異なるレジストリ キーと値。リダイレクトまたは反映されない共有レジストリ キーもあります。
MSDN のリストを読むことができます: Registry Keys Affected by WOW64。残念ながら、SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
これについては言及されていませんが、影響も受けています。
解決策レジストリの 64 ビット部分へのアクセス
を明示的に要求する必要があります。 RegOpenKeyEx
これは、呼び出しにフラグを追加することでKEY_WOW64_64KEY
実行できます (を使用して 64 ビット アプリケーションから 32 ビット レジストリにアクセスできますKEY_WOW64_32KEY
)。このフラグは Windows 2000 ではサポートされていないことに注意してください。アプリケーションがその (古い) バージョンと互換性がある必要がある場合は、ケースを管理する必要があります。
詳細については、MSDN の次のリンクを参照してください: Accessing an Alternate Registry View。
簡単にするために、呼び出しを次のように変更するだけです。
returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"),
0, KEY_ALL_ACCESS, &hKey);
に:
returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"),
0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
this を使用するフラグを使用せずに、そのパス
を
介してのみキーにアクセスできることに注意してください。ノードはWOW64 で使用される仮想化されたノードですが、これに依存するべきではないため、安定していますが、変更される可能性のある実装の詳細を考慮する必要があります。HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
Wow6432
参考資料
- MSDN のレジストリ仮想化。
- 読者は、この投稿で興味深いヒントを見つけることができます: http://poshcode.org/2470、これは PowerShell 用ですが、32 ビット アプリケーションから (64 ビット レジストリ部分に関連する) WMI データにアクセスする方法を説明しています。