2010-12-06 4 views
1

Ich habe ein Programm, das die verschiedenen Registrierungswerte aus "Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ComDlg32 \ LastVisitedMRU" ausgibt.C# Windows Registrierung GetValue Fehler

Allerdings gibt das Programm einen Fehler aus Kann nicht implizit type'object in 'string' an der s-Variable im GetValue-Teil oder dem Programm konvertieren! Und das Programm gibt einen Fehler von "Kann nicht auf einen geschlossenen Registrierungsschlüssel auch zugreifen" aus.

Kann jemand bitte beraten zu den Codes? Vielen Dank!

Der Code:

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(); 
     } 
    } 
} 
} 

Antwort

2

Wie Mattis Ratschlag, ist es nicht klar, warum Sie durch die die Subvalues ​​suchen. Warum nicht einfach das gewünschte bekommen? Etwas wie folgt aus:

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);    
     } 
    } 
} 

(Beachten Sie die Anweisung using um sicherzustellen, dass Sie immer den Registrierungsschlüssel schließen.)

Sie könnten auch in einigen Tests setzen wollen sicherstellen, dass der Schlüssel und Wert existieren , Na sicher.

+0

Der zurückgegebene Wert ist ein REG_BINARY-Typ.Ich habe es geschafft, die binären Werte zu bekommen, aber können Sie beraten, wie man binäre in Zeichenkette umwandelt? – JavaNoob

+0

funktioniert für mich, thx –

3

Hier einige Ratschläge über die Codes:

GetValue gibt ein object, kein string. Sie müssen es entweder in eine Zeichenfolge umwandeln oder ToString darauf aufrufen (verwenden Sie immer die erste, wenn Sie wissen, dass es tatsächlich eine Zeichenfolge ist).

+0

Der Werttyp des GetValue ist ein Binärwert von REG_Binary. Weißt du, wie man diese Variablen konvertiert oder speichert? – JavaNoob

+0

@JavaNoob: Ich würde mir vorstellen, dass ihr Wert ein Array von Bytes wäre. –

0

Wenn Sie sicher sind, dass das erwartete Ergebnis eine Zeichenfolge ist, geben Sie es einfach ein.

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

Ich glaube, GetValue wird ein Klein ‚s‘ String erwartet, die ein primitives ist, im Gegensatz zu einem Groß ‚S‘ String, die ein Objekt ist. Versuchen Sie dies:

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

Oder im Allgemeinen ersetzen Sie Ihre Verwendung von 'String' mit 'String' außer, wo 'String' geeignet ist.

0

Verwenden Sie eine Convert.ToString() Methode, um die object in Zeichenfolge zu konvertieren. Sie können auch .ToString() verwenden, es kann jedoch zu einer Null-Referenzausnahme führen, wenn der Schlüssel nicht existiert.

Zweitens, auf die Ausnahme erhalten Sie mit der geschlossenen Taste. Ändern Sie Ihre for each-Schleife, und verschieben Sie den Aufruf rk.Close() außerhalb der Schleife.

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

Ich benutze eine Struktur und versuche, dies zu tun. Ich habe immer Objekte zurückgegeben, wenn ich Strings wollte und als ich .toString() das ganze Programm einfach erstarrte. Ich erkannte, dass die Eigenschaften, die ich abrufen wollte, auch Felder sind. Ich brauchte den ganzen Tag um es herauszufinden:

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

Das funktionierte perfekt für mich.