2011-05-22 16 views
5

Ya he analizado los temas existentes, así que intente no incluir enlaces aquí.Obtiene el valor de la clave de registro C#

Quiero obtener el valor de una clave de registro, simple y llana. Esto es lo que tengo hasta ahora.

Registro: 1) hizo una llave bajo

CURRENT_USER \ Software \ Custom_Subkey \ custom_value \ custom_key \ valor_cadena

Estoy tratando de encontrar la valor_cadena

 string reg_subKey = "Software\\Custom_Subkey\\Custom_Value"; 

     RegistryKey root = Registry.CurrentUser.CreateSubKey(reg_subKey); 


     foreach (string keyname in root.GetValueNames()) 
     { 
      textBox4.AppendText(keyname.ToString() + Environment.NewLine); 

// Appends the following data to textBox4 once the foreach is completed: 
// Header1 
// Header2 
// Header3 
// Header4 
// Header5 

// Now I want to get the VALUES of each header: 

      using (RegistryKey key = root.OpenSubKey(keyname)) 
      { 

**// THIS LINE GETS HIGHLIGHTED WITH THE FOLLOWING ERROR: 
"Object reference not set to an instance of an object.**" 
       MessageBox.Show(key.ValueCount.ToString()); 
      } 
     } 

Hopefu lly esto es una solución simple. Espero escuchar sus respuestas. Gracias, Evan

+0

'root.OpenSubKey (nombre clave)' está devolviendo nulo. Es por eso que obtienes ese error. – Hogan

+0

¿No es ese el código correcto entonces? Estoy asumiendo ... ¿Hay alguna otra forma de abrir la llave? –

+2

De los documentos " Si no se puede encontrar la subclave especificada, se devuelve null". – Hogan

Respuesta

8

Creo que desee root.GetSubKeyNames() en un bucle no GetValueNames()

Mientras que los valores está trabajando para obtener los valores que sugeriría el siguiente bucle:

foreach(string keyname in root.GetSubKeyNames()) 
{ 
    // use key to get value and set textbox4 


    using (RegistryKey key = root.OpenSubKey(keyname)) 
    { 
     MessageBox.Show(key.ValueCount.ToString()); 
    } 
} 
+0

GetValueNames() está funcionando bien, está obteniendo todos los valores para la subclave dada. Pero luego quiero encontrar el valor de cadena de los valores que se encuentran arriba. Aquí es donde me encuentro con problemas. Estoy 99.99 por ciento seguro de que el nombre está escrito exactamente como se encuentra en el registro. Sin embargo, parece que tendré que investigar un poco más. –

+0

El valor no es el mismo que la clave. Vea el ejemplo de código anterior. – Hogan

+0

golpeó el clavo en la cabeza. + 1/Respuesta correcta. –

0

Lo hizo buscar en línea antes de publicar, ¿verdad?

por ejemplo: http://www.codeproject.com/KB/system/modifyregistry.aspx

+0

He estado usando esa página, y esta: http://www.java2s.com/Tutorial/CSharp/0520__Windows/Loopthroughallsubkeyscontainedinthecurrentkey.htm Simplemente no estoy seguro de cómo solucionar esta pequeña parte. Es confuso para mí, la primera vez que lo hago. –

+4

Leyó la pregunta antes de responder, ¿verdad? Él está preguntando específicamente por qué el código que ha escrito no funciona, no cómo escribirlo en primer lugar. –

3

El OpenSubKey method no arroja una excepción si no se encuentra la subclave especificada. En cambio, simplemente devuelve null. Es su responsabilidad como programador asegurarse de que se encontró y se abrió la clave apropiada al verificar el valor de retorno de la llamada al método.

Por lo tanto, mi sospecha es que la clave de registro que ha especificado no es válida. Abra el Editor del registro (regedt32.exe) y verifique que puede encontrar la clave en el registro exactamente como está escrito.

Si encuentra que la clave de registro se encuentra exactamente donde usted pensó que estaba, entonces el problema puede estar relacionado con el subsistema WOW64, que permite que las versiones de 64 bits de Windows ejecuten aplicaciones de 64 bits. Si el valor fue escrito en el registro por un programa de 32 bits, no podrá leerlo con el código anterior de un programa de 64 bits (o viceversa). La forma más sencilla de verificar esto es cambiar la configuración de compilación para su proyecto. Por ejemplo, si actualmente está compilando para x86, cambie a compilar para x64 o viceversa. Registry redirection también puede estar en su camino; esto también verificará eso.

+0

Sé que esto me hace sonar como un agujero, pero no dude en declinar ... ¿Estaría dispuesto a hacer una clave de registro en "HKCU \ software" y luego agregar otra clave debajo de esta clave, y luego ... dar a esta clave final un valor? Una vez que las llaves estén allí, ¿podrás ver dónde estoy arruinando? No creo que mi sistema operativo sea el problema, ya que estoy haciendo todo esto en una máquina en este momento (32 bits). –

+1

@Evan: Darn, pensé que la sugerencia de 64 bits sería la respuesta. Supongo que puedo hacer eso ... Dame un minuto. –

+0

@Evan: ¡El problema es que 'root' no tiene subclaves! Tiene un * valor *, pero no subclaves. –

1

Yo quería lo mismo y tu código me ayudó, pero como dijiste, no funcionó correctamente. Entonces, hice algunas modificaciones y creo que funciona bien ahora. Pruebe esto:

//Just make the reference until "custom_subkey", not to the next one ("custom value") 
string reg_subKey = "Software\\Custom_Subkey"; 

RegistryKey root = Registry.CurrentUser.CreateSubKey(reg_subKey); 

//Use GetSubKeyNames, instead of GetValueNames, because now you are in a higher level 
foreach (string keyname in root.GetSubKeyNames()) 
{ 
    using (RegistryKey key = root.OpenSubKey(keyname)) 
    { 
     foreach (string valueName in key.GetValueNames()) 
     { 
      MessageBox.Show(valueName); 
      MessageBox.Show(key.GetValue(valueName).ToString()); 
     } 
    } 
} 
Cuestiones relacionadas