2010-12-06 16 views
1

"Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ComDlg32 \ LastVisitedMRU"からさまざまなレジストリ値を出力するプログラムがあります。C#WindowsレジストリGetValueエラー

しかし、プログラムはGetValue部分またはプログラムのs変数の 'string'に型 'オブジェクト'を変換することはできません。そして、「閉じたレジストリキーにもアクセスできません」というエラーが出力されます。

コードにアドバイスをお願いしますか?ありがとう!

コード:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Win32; 

namespace RegKeys 
{ 
class ConsoleApplication1 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      RegistryKey rk = Registry.CurrentUser; 

      rk = rk.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU", false); 
      PrintKeys(rk); 
     } 

     catch (Exception MyError) 
     { 
      Console.WriteLine("An error has occurred: " + MyError.Message); 
     } 
    } 

    static void PrintKeys(RegistryKey rk) 
    { 
     if (rk == null) 
     { 
      Console.WriteLine("No specified registry key!"); 
      return; 
     } 

     String[] names = rk.GetValueNames(); 

     Console.WriteLine("Subkeys of " + rk.Name); 
     Console.WriteLine("-----------------------------------------------"); 

     foreach (String s in names) 
     { 
      try 
      { 
       if (s == "MRUList") 
       { 
        continue; 
       } 

       else 
       { 
        String val = rk.GetValue(s); 
        Console.WriteLine(s + " Contains the value of : " + val); 
       } 

       rk.Close(); 
      } 

      catch (Exception MyError) 
      { 
       Console.WriteLine("An error has occurred: " + MyError.Message); 
      } 

      Console.WriteLine("-----------------------------------------------"); 
      rk.Close(); 
     } 
    } 
} 
} 

答えて

2

Mattiのアドバイスと同様に、すべてのサブバルを見ている理由がわかりません。あなたが望むものを手に入れてみませんか?このような何かを:

using System; 
using Microsoft.Win32; 

class Test 
{ 
    static void Main() 
    { 
     using (var key = Registry.CurrentUser.OpenSubKey 
       (@"Software\Microsoft\Windows\CurrentVersion\" + 
       @"Explorer\ComDlg32\LastVisitedMRU", false)) 
     { 
      string value = (string) key.GetValue("MRUList"); 
      Console.WriteLine(value);    
     } 
    } 
} 

(あなたは常に、レジストリキーを閉じることを確認するために使用した文を注意してください。)

あなたはは、キーと値が存在することを確認するためにいくつかのテストに入れたいかもしれません、 もちろん。

+0

返される値はREG_BINARY型です。私はバイナリ値を取得することができましたが、バイナリを文字列に変換する方法をアドバイスできますか? – JavaNoob

+0

は私のために働く、thx –

3

ここではコードのいくつかのアドバイスです:

GetValueメソッドはobject、ないstringを返します。文字列にキャストするか、ToStringを呼び出す必要があります(実際には文字列であることがわかっている場合は常に前者を使用します)。

+0

GetValueの値の型はREG_Binaryのバイナリ値です。それらの変数を変換または格納する方法を知っていますか? – JavaNoob

+0

@JavaNoob:私はその値がバイトの配列であると思います。 –

0

期待される結果が文字列であることが確かであれば、それを型キャストするだけです。

String val = (String) rk.GetValue(s); 
//or 
String val = rk.GetValue(s) as String; 
0

私はGetValueメソッドがオブジェクトである大文字の「S」文字列とは反対に、原始的である小文字の「S」の文字列を、期待していると信じています。 「string」が適切である場合を除いて「文字列」と「文字列」の使用状況を置き換える

String val = rk.GetValue(s.toString()); 

または一般に:これを試してみてください。

0

Convert.ToString()メソッドを使用して、objectを文字列に変換します。 .ToString()も使用できますが、キーが存在しない場合はnull参照例外が発生する可能性があります。

第2に、例外としてクローズドキーを取得します。 for eachループを変更し、rk.Close()呼び出しをループ外に移動します。

foreach (String s in names) 
    { 
     try 
     { 
      if (s == "MRUList") 
      { 
       continue; 
      } 

      else 
      { 
       String val = rk.GetValue(s); 
       Console.WriteLine(s + " Contains the value of : " + val); 
      } 


     } 

     catch (Exception MyError) 
     { 
      Console.WriteLine("An error has occurred: " + MyError.Message); 
     } 

     Console.WriteLine("-----------------------------------------------"); 

    } 
    rk.Close(); 
0

私は構造体を使用しています。私は文字列が必要なときにオブジェクトを返すようにしていました。そして、私がToString()を実行したときに、プログラム全体が凍結しました。私が検索したいプロパティはフィールドでもあることに気付きました。私はいつもそれを理解するために私を必要とした:

string value = myObjectInstance.GetType(). 
    GetField("myFieldName").GetValue(newEntry) as string; 

それは私のために完全に働いた。

関連する問題