VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 用VB操作注册表(八)--所用函数收录
发表评论(0)作者:梦里水乡, 平台:VB6.0+Win98, 阅读:10243, 日期:2001-02-13
VB操作注册表--所用函数收录

梦里水乡


VB操作注册表--所用函数收录


RegOpenKey--取得SubKey的Hkey


VB声明 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


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的所有SubKey


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

参数说明:

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或者SubKey


Declare 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下则会报错。



-------------------------------------------------------

-------------------------------------------------------

-------------------------------------------------------

作者的话

梦里水乡


我在早期学习Vb时,老早就想能够掌握用它来控制注册表的一些操作,但一直苦于没有找到相应的资料。后来在白云黄鹤bbs站上看到了一篇由VisualBasic版版主coolknight撰写的有关这方面的文章,于是发信去向他请教。得到了他的无私的帮助,他为我提供了用Vb操作注册表的源代码。我拿回来仔细研究后终于掌握了这方面的技术。



后来我又买到了一本讲述windows api方面的书--由人民邮电出版社出版的《Visual Basic6.0与Windows API讲座》,是由台湾的王国荣老师编写的。再次读了一下关注册表方面的部分, 再次受到震撼。原来我掌握的技术还太复杂了一些,还有更简单的方法。


在此,我先向coolknight和王国荣老师表示敬意和感谢。


受神奇注册表网站主人lgyh所托,写了这一系列文章,希望同时对Vb和注册表感兴趣朋友能够解决一些平时技术上的难题并能学到一些相关的知识,那么我的愿望就算达到了。需要说明的是,这些文章中有些代码我抄录自《Visual Basic6.0与Windows API讲座》一书。非为赢利目的,但求知识与技术共享。


就说这些吧,本来还想编写一个用Vb操作注册表的演示性程序的,但我的工作太忙了。我是抽出许多休息时间来完成这些文章的。我本来还写了一个清除木马冰河服务器端程序的,但木马冰河程序好象又升级了,我还没来得及研究它的工作过程,我的代码没有升级,就不好意思拿出来让大家笑话了。