我想读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中启动项的列表并显示在文本框里。运行看不到结果
请各位帮我看看错误在哪里
我的程序如下:
Option ExplicitPrivate Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As LongPrivate 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

解决方案 »

  1.   

    呵呵,帮你查了下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 SubNameList(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