读取注册表一给定键的值

redloveqq 2007-08-01 04:18:38
我想读取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
...全文
158 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
redloveqq 2007-08-02
  • 打赏
  • 举报
回复
谢谢了
zzyong00 2007-08-01
  • 打赏
  • 举报
回复
呵呵,帮你查了下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

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧