读取注册表一给定键的值
我想读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中启动项的列表并显示在文本框里。运行看不到结果
请各位帮我看看错误在哪里
我的程序如下:
Option Explicit
Private Declare Function RegOpenKey Lib "advapi32.dll " Alias "RegOpenKeyA " (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll " _
Alias "RegQueryValueExA " (ByVal hKey As Long, _
ByVal lpValueName As String, ByVal lpReserved As Long, _
lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll " _
(ByVal hKey As Long) As Long
Const HKEY_LOCAL_MACHINE = &H80000002
Private Const REG_NONE = 0
Private Const REG_SZ = 1
Private Const REG_EXPAND_SZ = 2
Private Const REG_BINARY = 3
Private Const REG_DWORD = 4
Private Const REG_DWORD_BIG_ENDIAN = 5
Private Const REG_MULTI_SZ = 7
Private Sub Command1_Click()
Dim hKey As Long, ret As Long, lenData As Long, typeData As Long
Dim Name As String, NameList(0 To 4) As String
Dim i As Integer, s As String
Text1.Text = " "
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run ", hKey)
If ret <> 0 Then Exit Sub
NameList(0) = " "
NameList(1) = "Adobe Reader Speed Launcher ": NameList(2) = "RavTask ": NameList(3) = "RfwMain "
NameList(4) = "runeip "
For i = 0 To UBound(NameList)
Name = NameList(i)
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)
If ret <> 0 Then
RegCloseKey hKey
Exit Sub
End If
If typeData = REG_SZ Then
s = String(lenData, Chr(0))
RegQueryValueEx hKey, Name, 0, REG_SZ, ByVal s, lenData
s = Left(s, InStr(s, Chr(0)) - 1)
Text1.SelText = IIf(Name = " ", "(默认值) ", Name) & " = " & s & vbCrLf
End If
Next
RegCloseKey hKey
End Sub
[解决办法]
呵呵,帮你查了下MSDN,原来这是Microsoft的一个BUG,文章名《BUG: RegQueryValueEx()May Fail When lpszValueName Is NULL》,
Results:
RegQueryValueEx() fails. GetLastError() returns 14.
也就是说,当用RegQueryValueEx读与默认键值,正好,哪个键值是NULL,RegQueryValueEx就会出错(返回值不为0),设置GetLastError为14。
而你第一个NameList(0) = " ",正好是这种情况!但你已经用:
If ret <> 0 Then
RegCloseKey hKey
Exit Sub
End If
结束了过程,当然什么也查不出来了!
简单地改了一下
Private Sub Command1_Click()
Dim hKey As Long, ret As Long, lenData As Long, typeData As Long
Dim Name As String, NameList(0 To 4) As String
Dim i As Integer, s As String
Text1.Text = " "
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run ", hKey)
If ret <> 0 Then Exit Sub
NameList(0) = " "
NameList(1) = "Adobe Reader Speed Launcher ": NameList(2) = "RavTask ": NameList(3) = "RfwMain "
NameList(4) = "runeip "
For i = 0 To UBound(NameList)
N = NameList(i)
ret = RegQueryValueEx(hKey, N, 0, typeData, ByVal vbNullString, lenData)
If ret = 0 Then
If typeData = REG_SZ Then
s = String(lenData, Chr(0))
RegQueryValueEx hKey, N, 0, REG_SZ, ByVal s, lenData
s = Left(s, InStr(s, Chr(0)) - 1)
Text1.Text = Text1.Text & IIf(N = " ", "(默认值) ", N) & " = " & s & vbCrLf
End If
Else
Text1.Text = IIf(N = " ", "(默认值) ", N) & " = " & s & vbCrLf
End If
Next
RegCloseKey hKey
end sub