I am just trying to do a simple check if a registry location exists and the answers from other questions here are not working. Here is my code. I have a label for ON and a label for OFF that are just the entry is found or not. I have the registry entry in but not getting the labels to flip. FriendlyName is a key in 7&639dc5f&0&0000.
Private Sub CheckUSB_Serial()
If My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000", _
"FriendlyName", Nothing) Is Nothing Then
USB_SERIAL_ON.Visible = False
USB_SERIAL_OFF.Visible = True
Else
USB_SERIAL_ON.Visible = True
USB_SERIAL_OFF.Visible = False
End If
End Sub
CodePudding user response:
Starting with .NET Framework 4 (I believe), RegistryKey.OpenBaseKey is available which allows one to specify a Registry View. This is particularily useful when attempting to read the 64-bit registry on a 64-bit OS when one's application is running as 32-bit. It works for both 32-bit and 64-bit operating systems. RegistryKey.OpenSubKey is used in conjunction with RegistryKey.OpenBaseKey.
According to the documentation, OpenSubKey
returns null (Nothing) if the operation failed. It also raises the following exceptions:
- ArguementNullException
- ObjectDisposedException
- Security Exception
Therefore if one attempts to open a registry subkey and the value is null (Nothing), the key doesn't exist.
Try the following:
Add the following imports statement
Imports Microsoft.Win32
SubkeyExists:
Public Function SubkeyExists(hive As RegistryHive, subkey As String, Optional regView As RegistryView = RegistryView.Registry64) As Boolean
'open specified registry hive with specified RegistryView
Using rKey As RegistryKey = RegistryKey.OpenBaseKey(hive, regView)
If rKey IsNot Nothing Then
Using sKey As RegistryKey = rKey.OpenSubKey(subkey, False)
If sKey IsNot Nothing Then
Return True
Else
Return False
End If
End Using
Else
Throw New Exception($"Error (SubkeyExists) - Could Not open '{hive.ToString()}' ")
End If
End Using
End Function
Usage:
Dim result As Boolean = SubkeyExists(RegistryHive.LocalMachine, "SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000")
'Dim result As Boolean = SubkeyExists(RegistryHive.LocalMachine, "SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000", RegistryView.Default)
Alternatively, one could use recursion to check if each portion of the registry subkey exists (left-to-right).
To get a value from a ValueName within a specified subkey, one can use the following:
GetRegistryValue:
Public Function GetRegistryValue(hive As RegistryHive, subkey As String, valueName As String, Optional regView As RegistryView = RegistryView.Registry64) As Object
Using rKey As RegistryKey = RegistryKey.OpenBaseKey(hive, regView)
If rKey IsNot Nothing Then
'open subkey
Using sKey As RegistryKey = rKey.OpenSubKey(subkey, False)
If sKey IsNot Nothing Then
'read from registry
'Debug.WriteLine($"'{valueName}' Data Type: {sKey.GetValueKind(valueName)}")
Return sKey.GetValue(valueName)
Else
Throw New Exception($"Error (GetRegistryValue) - Could not open '{subkey}'")
End If
End Using
Else
Throw New Exception($"Error (GetRegistryValue) - Could Not open '{hive.ToString()}' ")
End If
End Using
End Function
Usage
Dim result As String = CType(GetRegistryValue(RegistryHive.LocalMachine, "SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000", "FriendlyName"), String)
CodePudding user response:
Thank you all for the help. This is the code I ended up using and does what I need it to:
Imports Microsoft.Win32
Private Sub CheckUSB_Serial()
Dim RegVersion As Microsoft.Win32.RegistryKey
Dim KeyValue = "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_04E2&PID_1422&MI_00\\7&639dc5f&0&0000"
RegVersion = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(KeyValue, False)
If RegVersion IsNot Nothing Then
USB_SERIAL_ON.Visible = True
USB_SERIAL_OFF.Visible = False
RegVersion.Close()
End If
If RegVersion Is Nothing Then
USB_SERIAL_ON.Visible = False
USB_SERIAL_OFF.Visible = True
RegVersion.Close()
End If
End Sub