Public Function setkeyvalue(Key As String, keyname As String, keyvalue As String) As Long
    Dim result As Long
    Dim ltype As Long
    Dim alen As Long
    Dim ahandle As Long
    ltype = REG_SZ
    alen = LenB(StrConv(keyvalue, vbFromUnicode))
    ahandle = openkey(Key)
    result = RegSetValueEx(ahandle, keyname, 0, ltype, keyvalue, alen)
    RegFlushKey (ahandle)
    setkeyvalue = result
End FunctionPublic Function getkeyvalue(Key As String, keyname As String) As String
    Dim adata As String * 128
    Dim alen As Long
    Dim result As Long
    Dim ltype As Long
    Dim ahandle As Long
    On Error GoTo geterror
    ltype = REG_SZ
    adata = String(128, " ")
    alen = Len(adata)
    ahandle = openkey(Key)
    result = RegQueryValueEx(ahandle, keyname, 0, ltype, adata, alen)
    getkeyvalue = Left(adata, alen - 1)
    Exit Function
geterror:
    getkeyvalue = "err"
End Function
以上函数在读取注册表时,如果键值中有中文,长度就取不对,英文完全正确。(应该与unicode有关吧)哪位大侠帮我看看有什么问题,谢谢。(API申明、openkey函数等就略了)

解决方案 »

  1.   

    result = RegSetValueEx(ahandle, keyname, 0, ltype, keyvalue, alen+1)
    试试看
      

  2.   

    以前写的:Public Property Let Str(ByVal hKey As Long, ByRef ValueName As String, Optional ByRef RegType As Long = REG_SZ, RHS As String)
        If StrPtr(ValueName) = 0 Then ValueName = ""
        If StrPtr(RHS) = 0 Then RHS = ""
        If mSystem.IsANSISystem Then
            m_ErrNum = RegSetValueExA(hKey, ByVal ValueName, 0, RegType, ByVal RHS, LenB(StrConv(RHS, vbFromUnicode)) + 1)
        Else
            m_ErrNum = RegSetValueExW(hKey, StrPtr(ValueName), 0, RegType, ByVal StrPtr(RHS), (Len(RHS) + 1) * 2)
        End If
    End Property
      

  3.   

    VB操作注册表
    新版:
    http://www.sqreg.com/list.asp?id=243
    http://www.sqreg.com/list.asp?id=244
    http://www.sqreg.com/list.asp?id=245
    http://www.sqreg.com/list.asp?id=246
    http://www.sqreg.com/list.asp?id=247
    http://www.sqreg.com/list.asp?id=248
    http://www.sqreg.com/list.asp?id=249
    http://www.sqreg.com/list.asp?id=250
    http://www.sqreg.com/list.asp?id=251旧版:
    http://www.sqreg.com/file/vb/reg_01.htm
    http://www.sqreg.com/file/vb/reg_02.htm
    ......
    http://www.sqreg.com/file/vb/reg_07.htm
      

  4.   

    Option Explicit
    Option Compare TextPublic Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Public Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal hKey As Long, lpSubKey As Any, phkResult As Long) As Long
    Public Declare Function RegOpenKeyW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long, phkResult As Long) As Long
    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 RegOpenKeyExA Lib "advapi32.dll" (ByVal hKey As Long, lpSubKey As Any, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
    Public Declare Function RegOpenKeyExW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
    Public Declare Function RegOpenCurrentUser Lib "advapi32.dll" (ByVal samDesired As Long, ByRef phkResult As Long) As Long
    Public Declare Function RegOpenUserClassesRoot Lib "advapi32.dll" (ByVal hToken As Long, ByVal dwOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
    Public Declare Function RegConnectRegistry Lib "advapi32.dll" Alias "RegConnectRegistryA" (ByVal lpMachineName As String, ByVal hKey As Long, phkResult As Long) As Long
    Public Declare Function RegConnectRegistryA Lib "advapi32.dll" (lpMachineName As Any, ByVal hKey As Long, phkResult As Long) As Long
    Public Declare Function RegConnectRegistryW Lib "advapi32.dll" (ByVal lpMachineName As Long, ByVal hKey As Long, phkResult As Long) As Long
    Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As LongPublic Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long
    Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
    Public Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName 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
    Public Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" (ByVal hKey As Long, ByVal lpClass As String, lpcbClass As Long, lpReserved As Long, lpcSubKeys As Long, lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, lpcValues As Long, lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, lpcbSecurityDescriptor As Long, lpftLastWriteTime As FILETIME) As LongPublic Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
    Public Declare Function RegDeleteValueA Lib "advapi32.dll" (ByVal hKey As Long, lpValueName As Any) As Long
    Public Declare Function RegDeleteValueW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long) As Long
    Public 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 Byte, lpcbData As Long) As Long
    Public Declare Function RegQueryMultipleValues Lib "advapi32.dll" Alias "RegQueryMultipleValuesA" (ByVal hKey As Long, ByRef val_list As VALENT, ByVal num_vals As Long, ByVal lpValueBuf As String, ByRef ldwTotsize As Long) As Long
    Public Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue 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 RegQueryValueExA Lib "advapi32.dll" (ByVal hKey As Long, lpValueName As Any, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Public Declare Function RegQueryValueExW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Public Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
    Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
    Public Declare Function RegSetValueExA Lib "advapi32.dll" (ByVal hKey As Long, lpValueName As Any, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
    Public Declare Function RegSetValueExW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As LongPublic Declare Function RegLoadKey Lib "advapi32.dll" Alias "RegLoadKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpFile As String) As Long
    Public Declare Function RegReplaceKey Lib "advapi32.dll" Alias "RegReplaceKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpNewFile As String, ByVal lpOldFile As String) As Long
    Public Declare Function RegRestoreKey Lib "advapi32.dll" Alias "RegRestoreKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal dwFlags As Long) As Long
    Public Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal lpSecurityAttributes As Long) As Long
    Public Declare Function RegUnLoadKey Lib "advapi32.dll" Alias "RegUnLoadKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As LongPublic Declare Function RegFlushKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Public Declare Function RegDisablePredefinedCache Lib "advapi32.dll" () As Long
    Public Declare Function RegGetKeySecurity Lib "advapi32.dll" (ByVal hKey As Long, ByVal SecurityInformation As Long, ByVal pSecurityDescriptor As Long, lpcbSecurityDescriptor As Long) As Long
    Public Declare Function RegNotifyChangeKeyValue Lib "advapi32.dll" (ByVal hKey As Long, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long, ByVal hEvent As Long, ByVal fAsynchronus As Long) As Long
    Public Declare Function RegOverridePredefKey Lib "advapi32.dll" (ByVal hKey As Long, ByVal hNewHKey As Long) As Long
    Public Declare Function RegSetKeySecurity Lib "advapi32.dll" (ByVal hKey As Long, ByVal SecurityInformation As Long, ByVal pSecurityDescriptor As Long) As Long'typedef struct value_ent {
    '    LPTSTR   ve_valuename;
    '    DWORD ve_valuelen;
    '    DWORD ve_valueptr;
    '    DWORD ve_type;
    '}VALENT;
    Public Type VALENT
        ve_valuename As String
        ve_valuelen As Long
        ve_valueptr As Long
        ve_type As Long
    End Type
    Public Type ACL
        AclRevision As Byte
        Sbz1 As Byte
        AclSize As Integer
        AceCount As Integer
        Sbz2 As Integer
    End Type
    Public Type SECURITY_DESCRIPTOR
        Revision As Byte
        Sbz1 As Byte
        Control As Long
        Owner As Long
        Group As Long
        Sacl As ACL
        Dacl As ACL
    End Type
      

  5.   


    Public Const HKEY_CLASSES_ROOT     As Long = &H80000000
    Public Const HKEY_CURRENT_USER     As Long = &H80000001
    Public Const HKEY_LOCAL_MACHINE    As Long = &H80000002
    Public Const HKEY_USERS            As Long = &H80000003
    Public Const HKEY_PERFORMANCE_DATA As Long = &H80000004
    Public Const HKEY_CURRENT_CONFIG   As Long = &H80000005
    Public Const HKEY_DYN_DATA         As Long = &H80000006
    Public Const HKEY_PERF_ROOT As Long = HKEY_LOCAL_MACHINE
    Public Const READ_CONTROL As Long = &H20000Public Const STANDARD_RIGHTS_ALL As Long = &H1F0000
    Public Const STANDARD_RIGHTS_EXECUTE As Long = (READ_CONTROL)
    Public Const STANDARD_RIGHTS_READ As Long = (READ_CONTROL)
    Public Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
    Public Const STANDARD_RIGHTS_WRITE As Long = (READ_CONTROL)Public Const SYNCHRONIZE As Long = &H100000Public Const KEY_QUERY_VALUE        As Long = &H1
    Public Const KEY_SET_VALUE          As Long = &H2
    Public Const KEY_CREATE_SUB_KEY     As Long = &H4
    Public Const KEY_ENUMERATE_SUB_KEYS As Long = &H8
    Public Const KEY_NOTIFY            As Long = &H10
    Public Const KEY_CREATE_LINK       As Long = &H20
    Public Const KEY_READ As Long = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
    Public Const KEY_WRITE As Long = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
    Public Const KEY_EXECUTE As Long = (KEY_READ)
    Public Const KEY_ALL_ACCESS As Long = ((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_NONE As Long = 0
    Public Const REG_SZ As Long = 1
    Public Const REG_EXPAND_SZ As Long = 2
    Public Const REG_BINARY As Long = 3
    Public Const REG_DWORD As Long = 4
    Public Const REG_DWORD_LITTLE_ENDIAN As Long = 4
    Public Const REG_DWORD_BIG_ENDIAN As Long = 5
    Public Const REG_LINK As Long = 6
    Public Const REG_MULTI_SZ As Long = 7
    Public Const REG_RESOURCE_LIST As Long = 8
    Public Const REG_FULL_RESOURCE_DESCRIPTOR As Long = 9
    Public Const REG_RESOURCE_REQUIREMENTS_LIST As Long = 10
    Public Const REG_QWORD As Long = 11
    Public Const REG_QWORD_LITTLE_ENDIAN As Long = 11Public Const REG_NOTIFY_CHANGE_NAME As Long = &H1
    Public Const REG_NOTIFY_CHANGE_ATTRIBUTES As Long = &H2
    Public Const REG_NOTIFY_CHANGE_LAST_SET As Long = &H4
    Public Const REG_NOTIFY_CHANGE_SECURITY As Long = &H8
    Public Const REG_OPTION_NON_VOLATILE As Long = 0
    Public Const REG_OPTION_RESERVED As Long = 0
    Public Const REG_OPTION_VOLATILE As Long = 1
    Public Const REG_OPTION_CREATE_LINK As Long = 2
    Public Const REG_OPTION_BACKUP_RESTORE As Long = 4
    Public Const REG_OPTION_OPEN_LINK As Long = &H8
    Public Const REG_LEGAL_CHANGE_FILTER As Long = (REG_NOTIFY_CHANGE_NAME Or REG_NOTIFY_CHANGE_ATTRIBUTES Or REG_NOTIFY_CHANGE_LAST_SET Or REG_NOTIFY_CHANGE_SECURITY)
    Public Const REG_LEGAL_OPTION As Long = (REG_OPTION_RESERVED Or REG_OPTION_NON_VOLATILE Or REG_OPTION_VOLATILE Or REG_OPTION_CREATE_LINK Or REG_OPTION_BACKUP_RESTORE)Public Const REG_CREATED_NEW_KEY As Long = &H1
    Public Const REG_OPENED_EXISTING_KEY As Long = &H2Public Const REG_REFRESH_HIVE As Long = &H2
    Public Const REG_NO_LAZY_FLUSH As Long = &H4
    Public Const REG_FORCE_RESTORE As Long = &H8
    '///////////////////////////////////////////////////////////
    '###########################################################
    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Private m_ErrNum As LongPublic Property Get ErrNum() As Long
        ErrNum = m_ErrNum
    End PropertyPublic Function NumHKey(ByRef lpStr As String) As Long
        Select Case lpStr
        Case "HKEY_CLASSES_ROOT": NumHKey = HKEY_CLASSES_ROOT
        Case "HKEY_CURRENT_USER": NumHKey = HKEY_CURRENT_USER
        Case "HKEY_LOCAL_MACHINE": NumHKey = HKEY_LOCAL_MACHINE
        Case "HKEY_USERS": NumHKey = HKEY_USERS
        Case "HKEY_PERFORMANCE_DATA": NumHKey = HKEY_PERFORMANCE_DATA
        Case "HKEY_CURRENT_CONFIG": NumHKey = HKEY_CURRENT_CONFIG
        Case "HKEY_DYN_DATA": NumHKey = HKEY_DYN_DATA
        Case Else: NumHKey = 0
        End Select
    End FunctionPublic Function OpenKey(ByVal hKey As Long, ByRef SubKey As String, Optional ByVal samDesired As Long = KEY_ALL_ACCESS) As Long
        Dim hTempKey As Long
        
        If Right(SubKey, 1) = "\" Then
            SubKey = Left(SubKey, Len(SubKey) - 1)
        End If
        
        If mSystem.IsANSISystem Then
            m_ErrNum = RegOpenKeyEx(hKey, SubKey, 0, samDesired, hTempKey)
        Else
            m_ErrNum = RegOpenKeyExW(hKey, StrPtr(SubKey), 0, samDesired, hTempKey)
        End If
        
        OpenKey = hTempKey
        
    End FunctionPublic Function OpenKeyPath(ByRef KeyPath As String, Optional ByVal samDesired As Long = KEY_ALL_ACCESS) As Long
        Dim Pos As Long
        Dim hKey As Long
        
        Pos = InStr(1, KeyPath, "\")
        If Pos Then
            hKey = NumHKey(Left(KeyPath, Pos - 1))
            If hKey Then
                OpenKeyPath = OpenKey(hKey, Mid(KeyPath, Pos + 1), samDesired)
            Else
                OpenKeyPath = 0
            End If
        Else
            OpenKeyPath = OpenKey(hKey, KeyPath, samDesired)
        End If
        
    End FunctionPublic Sub CloseKey(ByVal hKey As Long)
        Call RegCloseKey(hKey)
    End Sub
    Public Property Get Str(ByVal hKey As Long, ByRef ValueName As String, Optional ByRef RegType As Long = REG_SZ) As String
        Dim StrLen As Long
        
        If StrPtr(ValueName) = 0 Then ValueName = ""
        If mSystem.IsANSISystem Then
            Dim TempBytes() As Byte
            m_ErrNum = RegQueryValueExA(hKey, ByVal ValueName, 0, RegType, ByVal 0&, StrLen)
            If m_ErrNum = S_OK Then
                ReDim TempBytes(1 To StrLen)
                m_ErrNum = RegQueryValueExA(hKey, ByVal ValueName, 0, RegType, TempBytes(1), StrLen)
                If m_ErrNum = S_OK Then
                    Str = StrConv(LeftB(TempBytes, StrLen - 1), vbUnicode)
                Else
                    Str = vbNullString
                End If
            Else
                Str = vbNullString
            End If
        Else
            Dim TempStr As String
            m_ErrNum = RegQueryValueExW(hKey, StrPtr(ValueName), 0, RegType, ByVal 0&, StrLen)
            If m_ErrNum = S_OK Then
                TempStr = String(StrLen \ 2 - 1, 0)
                m_ErrNum = RegQueryValueExW(hKey, StrPtr(ValueName), 0, RegType, ByVal StrPtr(TempStr), StrLen)
                Str = TempStr
            Else
                Str = vbNullString
            End If
        End If
        
    End PropertyPublic Property Let Str(ByVal hKey As Long, ByRef ValueName As String, Optional ByRef RegType As Long = REG_SZ, RHS As String)
        If StrPtr(ValueName) = 0 Then ValueName = ""
        If StrPtr(RHS) = 0 Then RHS = ""
        If mSystem.IsANSISystem Then
            m_ErrNum = RegSetValueExA(hKey, ByVal ValueName, 0, RegType, ByVal RHS, LenB(StrConv(RHS, vbFromUnicode)) + 1)
        Else
            m_ErrNum = RegSetValueExW(hKey, StrPtr(ValueName), 0, RegType, ByVal StrPtr(RHS), (Len(RHS) + 1) * 2)
        End If
    End PropertyPublic Sub DelValue(ByVal hKey As Long, ByRef ValueName As String)
        If StrPtr(ValueName) = 0 Then ValueName = ""
        If mSystem.IsANSISystem Then
            m_ErrNum = RegDeleteValueA(hKey, ByVal ValueName)
        Else
            m_ErrNum = RegDeleteValueW(hKey, StrPtr(ValueName))
        End If
    End Sub
      

  6.   

    mSystem.bas=======================================================================Option Explicit
    Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long
    Private Declare Function IsWindowUnicode Lib "user32.dll" (ByVal hWnd As Long) As Long
    Public Declare Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" (lpVersionInformation As Any) As Long
    Public Declare Function GetVersionExA Lib "kernel32.dll" (lpVersionInformation As Any) As Long
    Public Declare Function GetVersionExW Lib "kernel32.dll" (lpVersionInformation As Any) As Long
    Public Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128 ' Maintenance string for PSS usage
    End Type
    Public Type OSVERSIONINFOA
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion(0 To 128 - 1) As Byte
    End Type
    Public Type OSVERSIONINFOW
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion(0 To 128 - 1) As Integer
    End Type
    Public Type OSVERSIONINFOEX
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128 ' Maintenance string for PSS usage
        wServicePackMajor As Integer
        wServicePackMinor As Integer
        wReserved(0 To 1) As Integer
    End Type
    Public Type OSVERSIONINFOEXA
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion(0 To 128 - 1) As Byte
        wServicePackMajor As Integer
        wServicePackMinor As Integer
        wReserved(0 To 1) As Integer
    End Type
    Public Type OSVERSIONINFOEXW
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion(0 To 128 - 1) As Integer
        wServicePackMajor As Integer
        wServicePackMinor As Integer
        wReserved(0 To 1) As Integer
    End Type
    Private Const VER_PLATFORM_WIN32s As Long = 0
    Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1
    Private Const VER_PLATFORM_WIN32_NT As Long = 2
    '///////////////////////////////////////////////////////////
    '###########################################################
    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Private m_Inited As BooleanPrivate m_IsUnicodeSystem As BooleanPrivate os As OSVERSIONINFOEXW
    Private m_szCSDVersion As StringPublic Property Get Inited() As Boolean
        Inited = m_Inited
    End PropertyPublic Sub Init()
        If m_Inited Then Exit Sub
        
        Dim t As Long
        
        
        '判断是否是Unicode系统
        m_IsUnicodeSystem = IsWindowUnicode(GetDesktopWindow())
        
        
        '得到版本信息
        Dim osa As OSVERSIONINFOA
        Dim osw As OSVERSIONINFOW
        Dim osxa As OSVERSIONINFOEXA
        Dim osxw As OSVERSIONINFOEXW
        If m_IsUnicodeSystem = False Then
            osa.dwOSVersionInfoSize = Len(osa)
            Call GetVersionExA(osa)
            With osa
                os.dwMajorVersion = .dwMajorVersion
                os.dwMinorVersion = .dwMinorVersion
                os.dwBuildNumber = .dwBuildNumber
                os.dwPlatformId = .dwPlatformId
            End With
            t = lstrlenA(osa.szCSDVersion(0))
            m_szCSDVersion = StrConv(LeftB(osa.szCSDVersion, t), vbUnicode)
            
            If os.dwMajorVersion >= 5 Then
                osxa.dwOSVersionInfoSize = Len(osxa)
                If GetVersionExA(osxa) Then
                    With osxa
                        os.wServicePackMajor = .wServicePackMajor
                        os.wServicePackMinor = .wServicePackMinor
                        os.wReserved(0) = .wReserved(0)
                        os.wReserved(1) = .wReserved(1)
                    End With
                End If
            End If
            
        Else
            osw.dwOSVersionInfoSize = Len(osw)
            Call GetVersionExW(osw)
            With osw
                os.dwMajorVersion = .dwMajorVersion
                os.dwMinorVersion = .dwMinorVersion
                os.dwBuildNumber = .dwBuildNumber
                os.dwPlatformId = .dwPlatformId
            End With
            t = lstrlenW(osw.szCSDVersion(0))
            m_szCSDVersion = String(t, 0)
            Call lstrcpyW(StrPtr(m_szCSDVersion), osw.szCSDVersion(0))
            
            If os.dwMajorVersion >= 5 Then
                osxw.dwOSVersionInfoSize = Len(osxw)
                If GetVersionExW(osxw) Then
                    With osxw
                        os.wServicePackMajor = .wServicePackMajor
                        os.wServicePackMinor = .wServicePackMinor
                        os.wReserved(0) = .wReserved(0)
                        os.wReserved(1) = .wReserved(1)
                    End With
                End If
            End If
            
        End If
        
        
        m_Inited = True
        
    End SubPublic Property Get IsUnicodeSystem() As Boolean
        If m_Inited = False Then Init
        IsUnicodeSystem = m_IsUnicodeSystem
    End PropertyPublic Property Get IsANSISystem() As Boolean
        If m_Inited = False Then Init
        IsANSISystem = Not m_IsUnicodeSystem
    End PropertyPublic Property Get MajorVersion() As Long
        If m_Inited = False Then Init
        MajorVersion = os.dwMajorVersion
    End PropertyPublic Property Get MinorVersion() As Long
        If m_Inited = False Then Init
        MinorVersion = os.dwMinorVersion
    End PropertyPublic Property Get BuildNumber() As Long
        If m_Inited = False Then Init
        BuildNumber = os.dwBuildNumber
    End PropertyPublic Property Get PlatformId() As Long
        If m_Inited = False Then Init
        PlatformId = os.dwPlatformId
    End PropertyPublic Property Get CSDVersion() As String
        If m_Inited = False Then Init
        CSDVersion = m_szCSDVersion
    End PropertyPublic Property Get ServicePackMajor() As Long
        If m_Inited = False Then Init
        ServicePackMajor = os.wServicePackMajor
    End PropertyPublic Property Get ServicePackMinor() As Long
        If m_Inited = False Then Init
        ServicePackMinor = os.wServicePackMinor
    End PropertyPublic Property Get WinVer() As Long
        WinVer = (MajorVersion And &HFF&) * &H100& Or (MinorVersion And &HFF&)
    End PropertyPublic Property Get ServiceVer() As Long
        ServiceVer = (ServicePackMajor And &HFF&) * &H100& Or (ServicePackMinor And &HFF&)
    End Property