Referencia a objeto no establecida como instancia de un objeto. Ayuda.

Iniciado por 70N1, 6 Agosto 2010, 16:41 PM

0 Miembros y 1 Visitante están viendo este tema.

70N1


  Dim res As RegistryKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Network\" & s & resultado, False)






                Dim ase As String
                For Each ase In res.GetValueNames() <---- aki da el error

                    MsgBox(ase)
                Next ase

70N1

Novlucker

Has revisado el valor de res, seguro que no esta en NULL? :rolleyes:

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

70N1

Tienes razon... es null.
Pero ahora como hago para detectar si es null para seguir con el for?
70N1

Novlucker

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

[D4N93R]

Aparte de eso puede lanzarte otras Exceptions, como ObjectDisposedException o SecurityException, entonces para esos casos puedes hacer:
Código (vb.net) [Seleccionar]

Try
  Dim key As String
  key = "SYSTEM\CurrentControlSet\Control\Network\" & s & resultado
  Dim res As RegistryKey = Registry.LocalMachine.OpenSubKey(key, False)
  If(res is nothing) then
      return New Exception("La clave "& key &" no existe")
  End If
  Dim ase As String

  For Each ase In res.GetValueNames() <---- aki da el error
       MsgBox(ase)
  Next ase

Catch disposedex As ObjectDisposedException
Código en caso de que pase ésto

Catch secEx as SecurityException
  Código en caso de que pase ésto
   
End Try


Perdona si tengo algún error, no me sé muy bien la sintaxis de VB.Net

Saludos!

70N1

Esto es lo que e hecho por ahora. va muy bien.
Código (vbnet) [Seleccionar]

Imports System
Imports Microsoft.Win32

Class Reg
   

   Public Shared Sub Main()
       Dim rk As RegistryKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Network", False)
       PrintKeys(rk)
       Console.ReadKey()
   End Sub


   Public Shared Sub PrintKeys(ByVal rkey As RegistryKey)

       Dim names As String() = rkey.GetSubKeyNames()
       Dim i As Integer = 0
       Dim s As String
       For Each s In names

           Dim registro As RegistryKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Network\" & s, False)

           Dim e

           For Each e In registro.GetSubKeyNames()

               'MsgBox("SYSTEM\CurrentControlSet\Control\Network\" & s & e)

               Dim res As RegistryKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Network\" & s & "\" & e, False)
               Dim ase As String

               For Each ase In res.GetSubKeyNames()
                   MsgBox("SYSTEM\CurrentControlSet\Control\Network\" & s & "\" & e & "\" & ase)
                   Dim res1 As RegistryKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Network\" & s & "\" & e & "\" & ase, False)
                   Dim ase1 As String

                   For Each ase1 In res1.GetValueNames()

                       If ase1 = "PnpInstanceID" Then
                           Console.WriteLine(ase1)
                       End If

                   Next ase1
               Next ase
           Next e
       Next s
   End Sub
End Class


Ahora me falta ver el contenido de esa clave y compararla con la que tengo.
70N1

raul338

Cita de: 70N1 en  6 Agosto 2010, 19:34 PM
Ahora me falta ver el contenido de esa clave y compararla con la que tengo.
Hice este cambio en el code:
Código (vbnet,9) [Seleccionar]

Public Shared Sub PrintKeys(ByVal rkey As RegistryKey)
   '............
   For Each ase In res.GetSubKeyNames()
        MsgBox("SYSTEM\CurrentControlSet\Control\Network\" & s & "\" & e & "\" & ase)
        Dim res1 As RegistryKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Network\" & s & "\" & e & "\" & ase, False)
        Dim ase1 As String

        ' Lo puedes guardar en un string para comparar
        Console.WriteLine(res1.GetValue("PnpInstanceID"))
        Next ase
        '...
End Sub