别用RegSetValueExString!
VB操作注册表:
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_03.htm
http://www.sqreg.com/file/vb/reg_04.htm
http://www.sqreg.com/file/vb/reg_05.htm
http://www.sqreg.com/file/vb/reg_06.htm
http://www.sqreg.com/file/vb/reg_07.htm

解决方案 »

  1.   

    用VB操作注册表(三)
    梦里水乡 登录数据库Registry的Value的存取--读取某个Key指定名称的值我们在这篇文章中将讲述利用RegQueryValueEx函数来读取某个Key的指定名称的值(value)
    RegQueryValueEx的Vb函数声明和参数解释:
    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 
    hkey:Key Handle
    lpValueName:Value Name
    lpReserved:保留参数,调用时设置为0即可
    lpType:返回读取的数据类型
    lpData:返回读取的数据
    lpcbData:传入lpData数据的长度,若成功读取数据,则返回所读取的数据的长度。
    返回值: =0,表示成功;≠0,表示失败。
    说明:
    1、 这一函数除了可读取指定名称的值之外,也可以读取default value。如果要读取default value,只需要将
    参数lpValueName设置为""[空字符串]即可。
    2、lpType 的可能取值,我们在第二篇文章中曾经提到过它的。
    Enum ValueType 
    REG_NONE = 0 
    REG_SZ = 1 -->字符串
    REG_EXPAND_SZ = 2 -->可展开式字符串
    REG_BINARY = 3 -->Binary数据
    REG_DWORD = 4 -->长整数
    REG_DWORD_BIG_ENDIAN = 5 -->BIG_ENDIAN长整数
    REG_MULTI_SZ = 7 -->多重字符串
    End Enum 先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度,只需要将参数lpData设置为vbNullString[表示暂时不读取数据],然后由参数lpType获得数据类型,lpcbData获得数据长度。调用例子如下:
    Dim hKey As Long, ret As Long, lenData As Long, typeData As Long 
    Dim Name As String
    '读取HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run的internat.exe的value.
    Name="internat.exe"
    ret=RegOpenKey(HKEY_LOCAL_MACHINE,"Software\Microsoft\Windows\CurrentVersion\Run", hKey) 
    if ret=0 then
    ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)'注意ByVal千万别忘了
    end if
    在得到某个value的数据类型和数据长度后,我们将根据不同的数据类型进行不同的处理。下面分别叙述之。a-->数据类型为REG_SZ
    这种方式最简单,只需要在上面的语句结束之后使用以下语句就可以得到正确的字符串。eg:
    ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)
    S=String(lenData,Chr(0))
    RegQueryValueEx hKey, Name, 0, typeData, ByVal S, lenData '注意ByVal千万别忘了
    S=Left(S,InStr(S,Chr(0))-1) b-->数据类型为REG_EXPAND_SZ
    所谓REG_EXPAND_SZ类型的字符串是指字符串中可能含有%WinDir%之类的字符串[%WinDir%表示Windows所在目录我们可以在Ms-Dos方式下使用set命令来看看这类字符串,我们也许还会看到诸如TMP,PATH,WINBOOTDIR这些和WinDir类似的具有特殊意义的字符串。],遇到这类字符串,我们还必须调用另一个API函数ExpandEnvironmentStrings来将它展开[比如%WinDir%就展开为C:\WINDOWS]。以下是ExpandEnvironmentStrings的描述和用法:
    Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsA" (ByVal lpSrc As String, ByVal lpDst As String, ByVal nSize As Long) As Long 
    参数 类型及说明 
    lpSrc String,欲扩充的字串 
    lpDst String,扩充过后的字串 
    nSize Long,lpDst的长度。
    注意预先对lpDst进行初始化,使其与这个长度相符
    函数调用例:
    Dim S2 As String
    '先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度
    ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData) 
    S = String(lenData, Chr(0)) 
    RegQueryValueEx hKey, Name, 0, typeData, ByVal S, lenData 
    S = Left(S, InStr(S, Chr(0)) - 1) 'S为读取出来的字符串
    S2 = String(Len(S) + 256, Chr(0))'S2为扩展之后的字符串 
    ExpandEnvironmentStrings S, S2, Len(S2) 
    S2= Left(S2, InStr(S2, Chr(0)) - 1)c-->数据类型为REG_MULTI_SZ
    REG_MULTI_SZ为多重字符串,其结构如下: 字符串1  chr(0) 字符串2  chr(0) ... 字符串N  chr(0) chr(0) 下面的自定义子程序的功能是取得多重字符串中每一个字符串。
    Sub MultiStringToStringArray(S As String, S2() As String)
    'S为我们读取出来的多重字符串
    'S2为转换后的字符串数组
    Dim count As Integer, pos As Integer, pos2 As Integer, idx As Integer 
    pos = InStr(S, Chr(0))While pos > 0 count = count + 1 
    pos = InStr(pos + 1, S, Chr(0)) 
    Wend 
    '取得多重字符串中的字符串个数
    count = count - 1 ReDim S2(0 To count - 1) 
    pos = 1 
    For idx = 0 To count - 1 
    pos2 = InStr(pos, S, Chr(0)) 
    S2(idx) = Mid(S, pos, pos2 - pos) 
    pos = pos2 + 1 
    Next 
    End Sub
    在调用MultiStringToStringArray之前,要先定义一个不含任何元素的字符串数组。子程序调用例子如下:
    S= "WGL"+chr(0)+"LOVE"+chr(0)+"MEISHAN"+chr(0)+chr(0)
    Dim S2() As String
    MultiStringToStringArray S,S2
    那么执行之后,S2(0)="WGL",S2(1)="LOVE",S2(2)="MEISHAN"
    d-->数据类型为REG_DWORD,REG_DWORD_BIG_ENDIAN
    '先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度
    Dim L As Long
    ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData) 
    RegQueryValueEx hKey, Name, 0, typeData, L, lenDatae-->数据类型为REG_BINARY
    '先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度
    ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData) 
    ReDim bArr(0 To lenData - 1) As Byte 
    RegQueryValueEx hKey, Name, 0, typeData, bArr(0), lenData 一个完整的例子请下载后自行研究。 
      

  2.   

    Public Enum RegCType
        GetValue = 1
        SetValue = 2
        DeleteKey = 3
    End Enum
    '注册表的读写   读:返回读出的值    写/删:返回“0”表示成功,否则为写/删失败
    '删除时,如果str_SetValue的值为1表示删除 注册表的项
    Public Function fun_RegControlA(ByVal lng_Keymain As Long, ByVal str_Key As String, _
            str_ValueKey As String, ByVal lng_ValueType As Long, ByVal lng_Set As Long, Optional ByVal str_SetValue As String) As String
        
        'lng_Keymain        主键
        'str_Key            子键
        'str_ValueKey       子键中要操作的 键名
        'lng_ValueType      子键中要操作的键名的类型
        'lng_Set             读、写、删
        'str_setvalue      要写入的值
        
        On Error GoTo doError
        Dim hKey As Long
        Dim lpSubKey As String
        Dim lpSecurityattributes As SECURITY_ATTRIBUTES
        Dim phkResult As Long
        Dim lpdwDisposition As Long
        
        Dim lpValueName As String
        Dim lpType As Long
        Dim lpData As String
        Dim lpcbData As Long
        
        Dim dwType As Long
        Dim cbData As Long
        
        Dim lng_Ret As Long
        Dim str_Ret As String
        Dim lng_Temp As Long
        Dim int_I As Integer
        
        hKey = lng_Keymain
        lpSubKey = str_Key
        With lpSecurityattributes
            .nLength = Len(lpSecurityattributes)
            .bInheritHandle = True
            .lpSecurityDescriptor = 0
        End With
        lng_Ret = RegCreateKeyEx(hKey, lpSubKey, 0, "", 0, KEY_ALL_ACCESS, lpSecurityattributes, phkResult, lpdwDisposition)
        If lng_Ret = ERROR_SUCCESS Then
            hKey = phkResult
            If lng_Set = GetValue Then
                lpType = lng_ValueType
                lpValueName = str_ValueKey
                lpData = Space$(100)
                lpcbData = 100
                If lng_Ret = ERROR_SUCCESS Then
                    Select Case lpType
                        Case 1  'REG_SZ
                            lng_Ret = RegQueryValueEx(hKey, lpValueName, 0, lpType, ByVal lpData, lpcbData)
                            int_I = InStr(1, lpData, Chr(0))
                            If int_I > 1 Then
                                str_Ret = Left$(lpData, int_I - 1)
                            Else
                                str_Ret = ""
                            End If
                        Case 3  'REG_BINARY
                            lng_Ret = RegQueryValueEx(hKey, lpValueName, 0, lpType, int_I, 4)
                            str_Ret = CStr(int_I)
                        Case 4  'REG_DWORD
                            lng_Ret = RegQueryValueEx(hKey, lpValueName, 0, lpType, lng_Temp, 4)
                            str_Ret = CStr(lng_Temp)
                        Case Else
                            str_Ret = ""
                    End Select
                Else
                    str_Ret = ""
                End If
            ElseIf lng_Set = SetValue Then
                lpValueName = str_ValueKey
                dwType = lng_ValueType
                lpData = str_SetValue
                If lpData = "" Then
                    lng_Ret = 1
                Else
                    Select Case dwType
                        Case 1  'REG_SZ
                            cbData = LenB(StrConv(str_SetValue, vbFromUnicode))
                            lng_Ret = RegSetValueEx(hKey, lpValueName, 0, dwType, ByVal lpData, cbData)
                       Case 3  'REG_BINARY
                            lng_Temp = Val(lpData)
                            If lng_Temp > (2 ^ 8 - 1) Or lng_Temp < 0 Then
                                lng_Ret = 1
                            Else
                                lng_Ret = RegSetValueEx(hKey, lpValueName, 0, dwType, CByte(lng_Temp), 4)
                            End If
                        Case 4  'REG_DWORD
                            lng_Temp = Val(lpData)
                            If lng_Temp > (2 ^ 32 - 1) Or lng_Temp < 0 Then
                                lng_Ret = 1
                            Else
                                lng_Ret = RegSetValueEx(hKey, lpValueName, 0, dwType, lng_Temp, 4)
                            End If
                        Case Else
                            lng_Ret = 1
                    End Select
                End If
                If lng_Ret = ERROR_SUCCESS Then str_Ret = "0"
            ElseIf lng_Set = DeleteKey Then
                lpValueName = str_ValueKey
                If str_SetValue <> "1" Then
                    lng_Ret = RegDeleteValue(hKey, lpValueName)
                    If lng_Ret = ERROR_SUCCESS Then str_Ret = "0"
                Else    '删除项
                    lng_Ret = RegDeleteKey(hKey, lpValueName)
                    If lng_Ret = ERROR_SUCCESS Then str_Ret = "0"
                End If
            End If
        End If
        lng_Ret = RegCloseKey(hKey)
        fun_RegControlA = str_Ret
        Exit Function
    doError:
        RegCloseKey hKey
        fun_RegControlA = ""
    End Function
      

  3.   

    daviddivad是正确的,zyl910是灌水文章,他自己根本没有研究,没有涉及我的问题, (他为什么不只把26个字母给我算了,好让我自己组织个答案! RegQueryValueEx只是取值函数)  不过他还是应该得些分的!
      

  4.   

    问一下 daviddivad:   CByte(lng_Temp) 如何使注册表键值为 95 00 00 00 (二进制值)
    其他人知道的也可回答!
    (估计 daviddivad 得 60~70分 ,贴网页的(第一位)得 10 分 ,剩下的分配!)   
      

  5.   

    这篇文章就是这里讲了对REG_BINARY的处理你自己改成RegSetValueEx就行了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 LongRegSetValueEx hKey, 值名, 0, REG_BINARY, Byte数组(最小下标), 长度--------------------------------------------------------------------
    说实话
    碰见这样的人真的好想吐血
    刚才差点把这个贴子删了
      

  6.   

    来晚了~~~zyl910(910:分儿,我来了!) : 呀? 你真当上版主拉?
      

  7.   

    zyl910,算了吧。我们不为分,只为了给别人解答问题时自己也获得快乐。谁没有不会的时候,当初人家教你图你这积分吗。昨天我碰到一个,发个问题“如何让别的程序不关闭我的程序”结果我帮他解答了,我楼下的那个只回复了一句“同意CNGXYLYH的说法”,结果他得了40分,我得了15分,其他各人都得了5到20分不等。我看到了也只是一笑就算了。
      

  8.   

    To cngxylyh(olo):
    你那句“谁没有不会的时候”真的好打击我啊我当初就是靠注册表起家的:
    http://expert.csdn.net/Expert/topic/698/698548.xml?temp=.1530268
    现在问问题的人的素质越来越差了
    自己不想清楚就说别人这里那里不对(另一个范例:)
    自己也不想想程序怎么写
    到底是自己写程序还是要别人写啊当初我一看见标题就分辨出楼主是这样的人
    故意只给他参考资料,让他自己多想想
    没想到他居然这样
      

  9.   

    例如:
    fun_RegControlA(HKEY_CLASSES_ROOT, "", "ss", REG_BINARY, SetValue, 149)--------------------------------------------------------------------------------
    问一下 daviddivad:   CByte(lng_Temp) 如何使注册表键值为 95 00 00 00 (二进制值)
      

  10.   

    to 分儿,来了 你的网址贴出来我很感谢,开始我想至少给你一半分,但你把网页贴出来办我的问题版面弄的很糟糕,所以扣40分,网页我有IE可以自己浏览,明白我的意思吗? 不过你的:
    RegSetValueEx hKey, 值名, 0, REG_BINARY, Byte数组(最小下标), 长度
    可以加20!
    我的 使注册表键值为 95 00 00 00 (二进制值)答案不要了,我解决了!
      

  11.   

    那几天sqreg.com在改版
    以前的文章访问不了所以顺便复制了