2012-05-10 25 views
13

C++でレジストリエントリ"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"を開く必要があります。これは、Java 64ビットアプリケーションが含まれています。そのレジストリエントリのフルパスは"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"です。32ビットアプリケーションから64ビットレジストリにアクセス

このパスはregeditで見ることができます。私は使用する

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS, &hKey) 

レジストリを開きます。しかし、エラー値(2)を返します。

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")... 

成功した結果を返します。私に何ができる?

+0

32ビットアプリケーションですか? –

答えて

-2

エラー2は、レジストリパスが存在しないことを意味します。

キー{26A24AE4-039D-4CA4-87B4-2F86416024FF}は実際のMicrosoft \ Windowsの\ CurrentVersionの\アンインストール

+3

OPは「私たちはregeditでこのパスを見ることができます」と言います。 – PlasmaHH

24

32ビットと64のアプリケーションのレジストリキーが分離されている、ことができます\ SOFTWAREの下に存在していることを確認してくださいあなたの32ビットアプリケーションから64ビットレジストリに(直接)アクセスしないでください。あなたの場合、レジストリの部分の32ビットに必要なハイブが存在しない場合、親フォルダのみにアクセスできます。

MSDNから

:64ビットWindowsでは、レジストリエントリの一部は、32ビットアプリケーションと64ビットアプリケーションのために別々に格納され、レジストリリダイレクタとレジストリを使用して別の論理レジストリ・ビューにマッピング

アプリケーションの64ビットバージョンが32ビットバージョンとは異なるレジストリキーと値を使用する可能性があるためです。リダイレクトまたは反映されない共有レジストリキーもあります。

MSDNのリスト:Registry Keys Affected by WOW64を読むことができます。残念ながら、SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstallは言及されていませんが、影響を受けています。あなたがしなければならない何

ソリューション
は、明示的にレジストリの64ビット部分にアクセスするためにRegOpenKeyExを依頼することです。これはあなたの呼び出しにKEY_WOW64_64KEYフラグを追加することで行うことができます(KEY_WOW64_32KEYを使用して64ビットアプリケーションから32ビットレジストリにアクセスできます)。このフラグは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); 


注意このフラグを使用するフラグはHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstallです。 Wow6432ノードが仮想化されたノードですが、これに頼るべきではありませんが、安定していますが、実装の詳細を変更する必要があります。

参考文献
- Registry Virtualization(MSDN)
- 読者にはこの記事の興味深いヒントがあります:http://poshcode.org/2470、それはPowerShell用ですが、32ビットアプリケーションからWMIデータ(64ビットレジストリ部分を基準にして)にアクセスする方法について説明しています。

+0

ありがとうございました...その作業... –

+0

@ adriano-repetti注:Wow6432Nodeは32ビットキーが格納されている場所ではありません? 32ビットのキーには、パスを介して64ビットモードでアクセスできますが、それ以外の方法でアクセスすることはできません。 – Valdimar

+0

@vladimir yesパスを使用すると、フラグなしで64ビットアプリケーションから32ビットレジストリにアクセスできますが、逆はできません。しかし、フラグを使用すると両方の方法を行うことができます。 –