取注册表值时,取含中文字符的字符串注册值出错,哪位大侠知道如何解决?
RegOpenKeyEx HKEY_LOCAL_MACHINE, "SOFTWARE\Soft\Operator", 0, KEY_READ, hKey
RegQueryValueEx hKey, "SetupPath", 0, REG_SZ, ByVal TempValue, ValueSize
取含中文值时,ValueSize长度大于实际长度,TempValue中值在实际取的内容后还包括空格或其他字符。如:注册表中值为"c:\Program Files\MySoft\我的VB编程软件测试",TempValue取得值为"c:\Program Files\MySoft\我的VB编程软件测试   s   t "

解决方案 »

  1.   

    Option Explicit
    Const REG_SZ = 1 ' Unicode nul terminated string
    Const REG_BINARY = 3 ' Free form binary
    Const HKEY_CURRENT_USER = &H80000001
    Private Const HKEY_LOCAL_MACHINE = &H80000002
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) 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 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 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
    Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
        Dim lResult As Long, lValueType As Long, strBuf As String, lDataBufSize As Long
        'retrieve nformation about the key
        
        lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
        If lResult = 0 Then
            If lValueType = REG_SZ Then
                'Create a buffer
                strBuf = String(lDataBufSize, Chr$(0))
                'retrieve the key's content
                lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
                If lResult = 0 Then
                    'Remove the unnecessary chr$(0)'s
                    RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)
                End If
            ElseIf lValueType = REG_BINARY Then
                Dim strData As Integer
                'retrieve the key's value
                lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
                If lResult = 0 Then
                    RegQueryStringValue = strData
                End If
            End If
        End If
    End Function
    Function GetString(hKey As Long, strPath As String, strValue As String)
        Dim Ret
        'Open the key
        RegOpenKey hKey, strPath, Ret
        'Get the key's content
        GetString = RegQueryStringValue(Ret, strValue)
        'Close the key
        RegCloseKey Ret
    End Function
    Private Sub Command2_Click()
       Dim s As String
       s = GetString(HKEY_LOCAL_MACHINE, "SOFTWARE\Soft", "Operator")
       MsgBox s
    End Sub
      

  2.   

    关键在这句:
    RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)取出字串后,要用left处理
      

  3.   

    '看一看这个专门转换的函数
    Function AscConvStr(ss As String) As String
        Dim pos As Integer
        
        pos = InStr(ss, vbNullChar)
        If pos > 0 Then
            AscConvStr = Left(ss, pos - 1)
        Else
            AscConvStr = ss
        End If
    End Function
      

  4.   

    要用 ANSI 长度截取
    = strconv(leftb( strconv(s,vbFromUnicode),length),vbUnicode)
      

  5.   

    try:RegOpenKeyEx HKEY_LOCAL_MACHINE, "SOFTWARE\Soft\Operator", 0, KEY_READ, hKey
    RegQueryValueEx hKey, "SetupPath", 0, REG_SZ, ByVal TempValue, ValueSize
    TempValue=split(temp,chr(0))(0)