已经知道指定项名称来找到值
 RegOpenKey和RegQueryStringValue可以找到指定项名称的值,但我是要找到子节点下的所有项和
值,该节点下面的值只是字符串类型,没有别的类型,不用转换,用api怎么做?
将所有的值放到list上,名称放在另一个list上

解决方案 »

  1.   

    RegEnumKeyEx():枚举指定的打开注册表关键字的子关键字(32位);
    Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long 
    说明 
    枚举指定项下方的子项 
    返回值 
    Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码 
    参数表 
    参数 类型及说明 
    hKey Long,一个已打开项的句柄,或者指定一个标准项名 
    dwIndex Long,欲获取的子项的索引。第一个子项的索引编号为零 
    lpName String,用于装载指定索引处项名的一个缓冲区 
    lpcbName Long,指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)。一旦返回,它会设为实际装载到lpName缓冲区的字符数量 
    lpReserved Long,未用,设为零 
    lpClass String,项使用的类名。可以为vbNullString 
    lpcbClass Long,用于装载lpClass缓冲区长度的一个变量。一旦返回,它会设为实际装载到缓冲区的字符数量 
    lpftLastWriteTime FILETIME,枚举子项上一次修改的时间 一个例子:Const ERROR_NO_MORE_ITEMS = 259&
    Const HKEY_CURRENT_CONFIG = &H80000005
    Const HKEY_LOCAL_MACHINE = &H80000002
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    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 RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As Any) As Long
    Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Private Sub Form_Load()
        'KPD-Team 2001
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim hKey As Long, Cnt As Long, sName As String, sData As String, Ret As Long, RetData As Long
        Const BUFFER_SIZE As Long = 255
        'Set the forms graphics mode to persistent
        Me.AutoRedraw = True
        Me.Print "RegEnumKeyEx"
        Ret = BUFFER_SIZE
        'Open the registry key
        If RegOpenKey(HKEY_LOCAL_MACHINE, "Hardware", hKey) = 0 Then
            'Create a buffer
            sName = Space(BUFFER_SIZE)
            'Enumerate the keys
            While RegEnumKeyEx(hKey, Cnt, sName, Ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
                'Show the enumerated key
                Me.Print " " + Left$(sName, Ret)
                'prepare for the next key
                Cnt = Cnt + 1
                sName = Space(BUFFER_SIZE)
                Ret = BUFFER_SIZE
            Wend
            'close the registry key
            RegCloseKey hKey
        Else
            Me.Print " Error while calling RegOpenKey"
        End If
        Me.Print vbCrLf + "RegEnumValue"
        Cnt = 0
        'Open a registry key
        If RegOpenKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion", hKey) = 0 Then
            'initialize
            sName = Space(BUFFER_SIZE)
            sData = Space(BUFFER_SIZE)
            Ret = BUFFER_SIZE
            RetData = BUFFER_SIZE
            'enumerate the values
            While RegEnumValue(hKey, Cnt, sName, Ret, 0, ByVal 0&, ByVal sData, RetData) <> ERROR_NO_MORE_ITEMS
                'show data
                If RetData > 0 Then Me.Print " " + Left$(sName, Ret) + "=" + Left$(sData, RetData - 1)
                'prepare for next value
                Cnt = Cnt + 1
                sName = Space(BUFFER_SIZE)
                sData = Space(BUFFER_SIZE)
                Ret = BUFFER_SIZE
                RetData = BUFFER_SIZE
            Wend
            'Close the registry key
            RegCloseKey hKey
        Else
            Me.Print " Error while calling RegOpenKey"
        End If
    End Sub