RegOpenKey--取得SubKey的HkeyVB声明 Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" 
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long 
参数类型及说明:
hKey:Key Handle
lpSubKey:SubKey名称或路径
phkResult:若RegOpenKey执行成功,则这一参数返回Subkey的hKey.返回值: =0,表示成功;≠0,表示失败。[注意这一点与别的API函数不太一样]e.g:
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft", hKey) *************************************************************************RegCreateKey函数:建立SubKey
VB声明 Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" 
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
它的参数用法与RegOpenKey一样。所不同的是RegOpenKey只能打开已经有的SubKey,而RegCreateKey则可以建立SubKey,比较特别的是,如果调用RegCreateKey所建立的SubKey是一个已经存在的SubKey,则它的功能和RegOpenKey相同。由于RegCreateKey的这种特性,有的程序员干脆不用RegOpenKey,而用RegCreateKey来统一代替RegOpenKey。
e.g:
ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt", hKey)************************************************************************* RegClose函数:关闭SubKey
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long 
当我们不再存取Registry时,将打开或建立的SubKey关闭是一个比较好的习惯,就正如我们在使用C语言的文件打开函数后必须要关闭一样。
e.g:
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft", hKey) 
....
RegClose hkey
*************************************************************************RegQueryValue--读取某Key的默认值(default value)VB声明
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 
hKey: Key Handle
lpSubKey:SubKey名称路径
lpValue:返回读取的Default Value
lpcbValue:传入lpValue参数的长度,若成功读取了默认值default value,则返回default value字符串的长度(含chr(0))这个和C语言中字符串的处理相似,都是以chr(0)作为结束符。返回值: =0,表示成功;≠0,表示失败。
e.g:
ret = RegQueryValue(hKey, Subkey, "", lenS) ************************************************************************* RegSetValue--删除某Key的默认值(default value)VB声明
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 
hKey:Key Handle
lpSubKey:Subkey名称或路径
dwType:数据类型,但在这里只能接受REG_SZ[字符串类型]
lpData:所设置的字符串
cbData:lpData字符串的长度,这一长度包括chr(0)字符。
关于dwType的可能取值
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 e.g:
Function SetDefaultValue(ByVal hKey As Long, ByVal Subkey As String, ByVal Value As String) As Boolean 
Dim ret As Long, lenS As Long, S As String 
ret = RegSetValue(hKey, Subkey, REG_SZ, Value, LenB(StrConv(Value, vbFromUnicode)) + 1) SetDefaultValue = (ret = 0) 
End Function ************************************************************************* RegQueryValueEx--读取某Key的特定名称的值(Value)
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 

解决方案 »

  1.   


    e.g:
    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*************************************************************************RegEnumValue--列出某Key的所有名称的值Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long 
    '以下的两个函数是经过王国荣老师改编过的函数,与此相关,也一并列出.并且在我们的例子程序中要用到它们。RegEnumValueAsAny可以传入长整数和字符串;RegEnumValueAsAny2中lpData参数被改成Any后,可以使用Byte数组,由于Byte数组是采用”传地址方式来传递参数的,可以省下复制字符串数据的时间,使得程序变得更加高效。
    Declare Function RegEnumValueAsAny Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Declare Function RegEnumValueAsAny2 Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, lpValueName As Any, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    参数说明:
    hKey:Key Handle
    dwIndex:欲读取之名称的顺序
    lpValueName:返回所读取的名称
    lpcbValueName:传入lpValueName参数的长度,返回所读取的名称的长度,注意这一长度不含chr(0)
    lpReserved:保留参数,实际使用时传入ByVal 0即可
    lpType:返回所读取的数据类型
    lpData:返回所读取的数据
    lpcbData:传入lpData,返回所读取的数据长度
    返回值: =0,表示成功;≠0,表示失败。 
    调用例子:
    ret=0
    myindex=0
    while ret=0
    ret=RegEnumValue(hkey,myindex,Name,ByVal 0, typeData, ByVal vbNullString, lenData)
    myindex=myindex+1
    wend *************************************************************************RegSetValueEx--设置某Key特定名称的值(Value)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
    参数:
    hKey:Key Handle
    lpValueName:Value名称
    Reserved:保留参数,具体使用时置为0即可
    dwType:数据类型
    lpData:所设置的数据,注意这一参数被定义成lpData As Any,所以要传入字符串数据时别忘了在参数前加保留字ByVal
    cbData:数据的长度。注意:如果写入的数据属于REG_SZ、REG_EXPAND_SZ、REG_MULTI_SZ类型时,则这个长度应该包含chr(0)字符。
    返回值: =0,表示成功;≠0,表示失败。
    e.g:
    Dim hKey As Long 
    Dim L As Long 
    L = 99999 
    RegCreateKey HKEY_CURRENT_USER, "Software\SetValue", hKey 
    RegSetValueEx hKey, "LongData", 0, REG_DWORD, L, 4 
    ************************************************************************* RegDeleteValue--删除某Key的某一名称Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long 
    参数:
    hKey:Key Handle
    lpValueName: Value名称,如果想删除默认值的话,传入""[空字符串]即可。 
    返回值: =0,表示成功;≠0,表示失败。
    函数调用例:
    '我们假设在HKEY_CURRENT_USER\Software\SetValue有:
    '预设值--VB操作注册表
    'str1--我爱我的祖国
    '我们要删除这两个Value 
    ret = RegOpenKey(HKEY_CURRENT_USER, "Software\SetValue", hKey) 
    If ret = 0 Then 
    RegDeleteValue hKey, "Str1" 
    MsgBox "已删除HKCU\Software\SetValueSubKeyStr1Value" 
    RegDeleteValue hKey, "" 
    MsgBox "已删除HKCU\Software\SetValueSubKey‘预设值’" 
    End If*************************************************************************RegEnumKey--列出某Key的所有SubKeyDeclare 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 
    参数说明:
    hKey:Key Handle
    dwIndex:欲读取的SubKey的顺序
    lpName:返回所读取的SubKey的名称
    cbName:传入lpName的字符串长度。
    返回值: =0,表示成功;≠0,表示失败。
    调用例:
    Dim hKey As Long, ret As Long, Name As String, Idx As Long 
    List1.Clear 
    Idx = 0 
    Name = String(256, Chr(0)) 
    Do 
    ret = RegEnumKey(HKEY_CURRENT_USER, Idx, Name, Len(Name)) 
    If ret = 0 Then 
    List1.AddItem Left(Name, InStr(Name, Chr(0)) - 1) 
    Idx = Idx + 1 
    End If 
    Loop Until ret <> 0 *************************************************************************RegDeleteKey--删除Key或者SubKeyDeclare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
    参数:
    hKey:Key Handle
    lpSubKey:SubKey名称或者路径,若传入""[空字符串],表示删除Key本身。
    返回值: =0,表示成功;≠0,表示失败。 eg:
    Dim hKey,ret As Long 
    ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt\xiaoyuer", hKey) 
    ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt", hKey)
    ret = RegDeleteKey(hKey, "xiaoyuer")'删除HKEY_LOCAL_MACHINE\SOFTWARE\Hongqt\xiaoyuer
    注意: 
    如果我们利用RegDeleteKey函数删除一个含有SubKey的Key时,对于Windows98和Winnt来讲是不一样的。比如我们把上面的删除调用改成ret = RegDeleteKey(hKey, ""),则在windows98下,它会连hongqt下的xiaoyuer一起删除,而在winnt下则会报错。
      

  2.   

    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
      

  3.   

    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
    要声明RegOpenKey这个APIPublic Sub main()
        Dim i As Long, hKey As Long, hkey2 As Long, reg As Long, strTemp As String, boo As Boolean
       i=regopenkey(HKEY_LOCAL_MACHINE,"Software\Microsoft\Windows\CurrentVersion\Run", hkey2)
       if i<> 0 then
           msgbox "Error!"
           exit sub
       endif
       i = RegQueryValue(hkey2, "Software\Microsoft\Windows\CurrentVersion\Run", "", hKey)
       strTemp=string(hkey,chr(0))
          i = RegQueryValue(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", strTemp,len(strTemp))
          strTemp=Left(strTemp,Instr(strTemp,chr(0)))
          MsgBox i & "  " & strTemp & "  " & hKey
    End Sub
      

  4.   

    你写的有问题
    第一个参数是hKey,意思是一个已打开项的句柄,你没有用RegOpenKey取得SubKey的Hkey是不对的
      

  5.   

    HKEY_LOCAL_MACHINE=&H80000002,声明了吗?所使用的变量都声明了吗?