我用API调用enum串口名称,不编译没问题编译后就不行了,大家帮我看看问题出在哪了'----Registry API Functions--------
Public Declare Function RegCloseKey Lib "advapi32" (ByVal lHKey As Long) As Long
Public Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal lHKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Public Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lHKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
Public Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lHKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Public Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lHKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long, lpcbData As Long) As Long
Public Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal lHKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal lHKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal lHKey As Long, ByVal lpSubKey As String) As Long
Public Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal lHKey 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
Public Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal lHKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal lHKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As Any, phkResult As Long, lpdwDisposition As Long) As Long
Public Declare Function RegQueryValueExBinary Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lngHKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
'----Registry API Constants--------
Public Const STANDARD_RIGHTS_ALL = &H1F0000, KEY_QUERY_VALUE = &H1, KEY_NOTIFY = &H10, READ_CONTROL = &H20000
Public Const SYNCHRONIZE = &H100000, KEY_ENUMERATE_SUB_KEYS = &H8, STANDARD_RIGHTS_READ = (READ_CONTROL)
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Public Const REG_HEX = 4, REG_SZ = 1, REG_BINARY = 3, REG_DWORD = 4, KeyValSize As Long = 1024
Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Public Const KEY_SET_VALUE = &H2, KEY_CREATE_LINK = &H20
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
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 ERROR_SUCCESS As Long = 0&, REG_OPTION_NON_VOLATILE = 0
Public Const ERROR_NO_MORE_ITEMS = 259&
'----Registry API Types--------
Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
Public Enum eRegKeyType
    HKEY_CURRENT_USER = &H80000001
    HKEY_LOCAL_MACHINE = &H80000002
    HKEY_CLASSES_ROOT = &H80000000
    HKEY_USERS = &H80000003
    HKEY_CURRENT_CONFIG = &H80000005
    HKEY_DYN_DATA = &H80000006
End Enum
Type FILETIME ' 8 Bytes
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type
Public CommportName() As String
Public Function EnumComKey(ByVal sKeyPath As String, sItemName As String, Optional vDefault As Variant, Optional eKeyType As eRegKeyType = HKEY_LOCAL_MACHINE) As Variant
    Dim lRetVal As Long
    Dim i As Integer
    Dim EnumCom(0 To 100) As String
    Dim lpName1 As String
    Dim lpcbName1 As Long
    Dim lpcbClass1 As Long
    Dim lpclass1 As String
    Dim dwIndex1 As Long
    Dim lHKey As Long
    lRetVal = RegOpenKeyEx(eKeyType, sKeyPath, 0, KEY_READ, lHKey)
    If lRetVal = 0 Then
        dwIndex1 = 0
        Do
            lpcbName1 = 255
            lpName1 = Space(lpcbName1)
            lpcbClass1 = 255
            lpclass1 = Space(lpcbClass1)
            lRetVal = RegEnumValue(lHKey, ByVal dwIndex1, ByVal lpName1, lpcbName1, 0, ByVal 0&, ByVal 0&, ByVal 0&)
            If Trim(lpName1) = "" Then
             Exit Do
            Else
                EnumCom(dwIndex1) = Trim(lpName1)
                dwIndex1 = dwIndex1 + 1
            End If
        Loop While lRetVal <> ERROR_NO_MORE_ITEMS
    End If
    EnumComKey = dwIndex1
    If dwIndex1 > 0 Then
        ReDim CommportName(dwIndex1 - 1)
        For i = 0 To dwIndex1 - 1
             CommportName(i) = LoadValue("HARDWARE\DEVICEMAP\SERIALCOMM", EnumCom(i), "none", HKEY_LOCAL_MACHINE)
        Next i
    End If
    RegCloseKey lHKey
End Function

解决方案 »

  1.   

    Public Function LoadValue(ByVal sKeyPath As String, sItemName As String, Optional vDefault As Variant, Optional eKeyType As eRegKeyType = HKEY_LOCAL_MACHINE) As Variant
        Dim lRetVal As Long, lHKey As Long
        lRetVal = RegOpenKeyEx(eKeyType, sKeyPath, 0, KEY_READ, lHKey)
        If lHKey Then
            lRetVal = zQueryValueEx(lHKey, sItemName, LoadValue, vDefault)
            lRetVal = RegCloseKey(lHKey)
        Else
            LoadValue = vDefault
        End If
    End Function