目的:获取注册表中某个键下第s个子键的名字
声明:
Type FILETIME ' 8 Bytes
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Public 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
程序:
………………
………………
Dim phkResult As Long
Dim Iresult As Long
Dim Returns As String * 100
Dim FT As FILETIME
Dim Rsize As Long
Dim s As Long
s = 0
Iresult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Intel\LANDesk\VirusProtect6\CurrentVersion\Custom Tasks\TaskPadScheduled", 0, 0, phkResult)
Iresult = RegEnumKeyEx(phkResult, s, Returns, Rsize, 0, "", 0, FT)
………………
………………
问题:
运行程序时提示“编译错误:ByRef 参数类型不符”,光标自动移动至最后那一行的"FT"处,请高手给指点一下,谢谢!

解决方案 »

  1.   

    试试这样定义的Public 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, ByVal lpcbClass As Long, ByRef lpftLastWriteTime As FILETIME) As Long
      

  2.   

    Dim phkResult As Long
    Dim Iresult As Long
    Dim Returns As String * 100
    Dim FT As FILETIME
    Dim Rsize As Long
    Dim s As Long
    Dim lpcbClass As Long s = 0
    Rsize=100
    Iresult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Intel\LANDesk\VirusProtect6\CurrentVersion\Custom Tasks\TaskPadScheduled", 0, 0, phkResult)
    Iresult = RegEnumKeyEx(phkResult, s, Returns, Rsize, 0, vbNullString , lpcbClass , FT)
      

  3.   

    感谢zq972,现在虽然不报错了,但是在调试过程中发现各新问题,就是RegOpenKeyEx函数中的句柄“phkResult”根本就没有取到值,这样后面的RegEnumKeyEx函数也就没有作用了,请帮忙看看是怎么回事,谢谢!
      

  4.   

    文件form1
        Mydocument = Module1.GetRegInfoSZ(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "My Pictures")
    文件module1
    Option Explicit    Public Const REG_SZ As Long = 1
        Public Const ERROR_NONE = 0
        Public Const ERROR_OFFSET = 30061
        Public Const ERROR_SUCCESS = 0
        Public Const ERROR_BADDB = 1
        Public Const ERROR_BADKEY = 2
        Public Const ERROR_CANTOPEN = 3
        Public Const ERROR_CANTREAD = 4
        Public Const ERROR_CANTWRITE = 5
        Public Const ERROR_OUTOFMEMORY = 6
        Public Const ERROR_INVALID_PARAMETER = 7
        Public Const ERROR_ACCESS_DENIED = 8
        Public Const ERROR_INVALID_PARAMETERS = 87
        Public Const ERROR_NO_MORE_ITEMS = 259
        Public Const SYNCHRONIZE = &H100000
        Public Const STANDARD_RIGHTS_READ = &H20000
        Public Const STANDARD_RIGHTS_WRITE = &H20000
        Public Const STANDARD_RIGHTS_EXECUTE = &H20000
        Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
        Public Const STANDARD_RIGHTS_ALL = &H1F0000
        Public Const KEY_QUERY_VALUE = &H1
        Public Const KEY_SET_VALUE = &H2
        Public Const KEY_CREATE_SUB_KEY = &H4
        Public Const KEY_ENUMERATE_SUB_KEYS = &H8
        Public Const KEY_NOTIFY = &H10
        Public Const KEY_CREATE_LINK = &H20
        Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
        Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
        Public Const KEY_EXECUTE = (KEY_READ)
        Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
        Public Const REG_OPTION_NON_VOLATILE = 0
        Public Const MAX_PATH = 260    Public Const HKEY_CLASSES_ROOT = -2147483648#
        Public Const HKEY_CURRENT_USER = -2147483647#
        Public Const HKEY_LOCAL_MACHINE = -2147483646#
        Public Const HKEY_USERS = -2147483645#    'Public Const REG_SZ = 1& '字符串值
        Public Const REG_BINARY = 3& '二进制值
        Public Const REG_DWORD = 4& 'DWORD 值
        
        Dim lValueType
        Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
        (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
        
        Public 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
        
        Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) _
        As Long
    Public Function GetRegInfoSZ(MaxKey, MinKey As String, KeyName As String) As String
        On Error Resume Next
        Dim gs As String, sB As String
        Dim hKey As Long, ret As Long, ld As Long
        Dim iz As Integer
        ret = Module1.RegOpenKey(MaxKey, MinKey, hKey)
        ret = Module1.RegQueryValueEx(hKey, KeyName, 0&, lValueType, ByVal 0&, ld)
        If lValueType = REG_SZ Then
            sB = String(ld, " ")
            ret = Module1.RegQueryValueEx(hKey, KeyName, 0&, 0&, ByVal sB, ld)
            If ret = ERROR_SUCCESS Then
                iz = InStr(sB, Chr$(0))
                If iz > 0 Then
                    gs = Left$(sB, iz - 1)
                Else
                    gs = sB
                End If
            End If
        End If
        GetRegInfoSZ = gs
        RegCloseKey hKey
    End Function
    这样就能用,我在form里读的是"我的文档"地址
      

  5.   

    谢谢chen_bawang() ,我想你没太明白我的意思,我是要取某个键的子键名称,而不是某个键值,希望再帮我看看,谢谢!
      

  6.   

    firstly, check the return value of RegOpenEx, if it is 87, replace all "0" with "ByVal 0&" in the function call. this is only valid in VB6, not in VB.net