首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

读取注册表一给定键的值解决办法

2012-01-22 
读取注册表一给定键的值我想读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中启

读取注册表一给定键的值
我想读取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

热点排行