2012-12-05 4 views
54

で見ることができるのレジストリキーにnullを返します。OpenSubKeyは()私は、このキー内のサブ・キーのすべての表示名を取得しようとしている私はregedit.exeを

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} 
0:
 RegistryKey newKey; 
    string val; 

    string KeyPath64Bit = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
    RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(KeyPath64Bit); 

    string[] RegKeys64Bits = Registry.LocalMachine.OpenSubKey(KeyPath64Bit).GetSubKeyNames(); 

    foreach (string s in RegKeys64Bits) 
    { 
     newKey = mainKey.OpenSubKey(s); 
     val = newKey.GetValue("DisplayName", -1, RegistryValueOptions.None).ToString(); 
     if (val != "-1") 
      file64.WriteLine(val); 
    } 

コードを実行した後、私は私が必要とするキーのいずれかを見つけることができませんそれは表示名でなければなりません:Microsoft Visual C++ 2010 x64 Redistributable - 10.0.30319、代わりにGetSubKeyNames()メソッドは私にサブキーの表示名を与えません。

私は必要な正確なサブキーを取得できないのですが({DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E})、どうすれば入手できますか?

+0

管理者としてVisual Studioを実行している場合はできますか? – tsells

+0

@tsells試してみるとうまくいきません。 –

+0

64ビットOS上で32ビットプロセスで実行していますか? –

答えて

125

64ビットOS上の32ビットアプリケーションは、デフォルトでHKLM\Software\Wow6432Nodeノードを探します。キーの64ビット版を読むには、RegistryViewを指定する必要があります:

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) 
using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")) 
{ 
    // key now points to the 64-bit key 
} 

これを行うためのAPIは、.NET 4.0で追加されました。まだ3.5を使用している場合は、P/Invokeを使用して64ビットキーにアクセスする必要があります。 http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32-bit-application-or-vice-versa/

+0

ありがとうございました –

+0

これは解決策です。時間を節約してくれてありがとう。 –

+0

ありがとうございます。私は同じ鍵で同じ問題を抱えていました。 :) – ECC

関連する問題