请问我用 RegQueryValueEx 为什么不查询字符串类型的键值呢?,只能查long类型的,请大家帮助!先谢谢。

解决方案 »

  1.   

    Private 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
    Private Const ERROR_MORE_DATA = 234 '  dderror
    Private Sub Command1_Click()
    Dim S As String, ret As Boolean
    ret = GetDefaultValue(HKEY_CLASSES_ROOT, ".txt", S)
    MsgBox S
    End Sub
    Private Function GetDefaultValue(ByVal hKey As Long, ByVal Subkey As String, Value As String) As Boolean
    Dim ret As Long, lenS As Long, S As String
    ret = RegQueryValue(hKey, Subkey, "", lenS)
    If ret <> 0 And ret <> ERROR_MORE_DATA Then
    GetDefaultValue = False
    Exit Function
    End If
    S = String(lenS, Chr(0))
    ret = RegQueryValue(hKey, Subkey, S, lenS)
    If ret <> 0 Then
    GetDefaultValue = False
    Exit Function
    End If
    Value = Left(S, lenS - 1)
    GetDefaultValue = True
    End Function
      

  2.   

    i'am sorry ,楼上的,S返回的是空值
      

  3.   

    最前面少了Const HKEY_CLASSES_ROOT = &H80000000,剪切时掉了.加上就行了,返回"txtFile"
    那是查询默认值的,下面的是查询指定值的Private Sub Command2_Click()
    Dim hKey As Long, ret As Long, lenData As Long, typeData As Long
    Dim Name As String
    Dim s As String
    '读取HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run的internat.exe的value.
    Name = "ravtask"
    ret = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", hKey)
    If ret = 0 Then
    ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData) 
    End If
    s = String(lenData, Chr(0))
    ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal s, lenData) 
    s = Left(s, InStr(s, Chr(0)) - 1)
    MsgBox s
    End Sub'若Run下没有RavTask改成你机子有的,否则又是空串!
    '以下代码加在模块里
    Public Const HKEY_CURRENT_USER = &H80000001
    Public Const HKEY_LOCAL_MACHINE = &H80000002
    Public Const HKEY_USERS = &H80000003
    Public Const HKEY_PERFORMANCE_DATA = &H80000004
    Public Const HKEY_CURRENT_CONFIG = &H80000005
    Public Const HKEY_DYN_DATA = &H80000006
    Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult 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 Const ERROR_MORE_DATA = 234 '  dderror
    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
    Enum ValueType
    REG_NONE = 0
    REG_SZ = 1
    REG_EXPAND_SZ = 2
    REG_BINARY = 3
    REG_DWORD = 4
    REG_DWORD_BIG_ENDIAN = 5
    REG_MULTI_SZ = 7
    End Enum
    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         ' Note that if you declare the lpData parameter as String, you must pass it By Value.
      

  4.   

    ok,Thank u~~  
    辛苦您了。