注册表(Registry)

用Windows系统提供的注册表编辑器regedit.exe来认识登录数据库(Registry)。

1、Key和SubKey

注册表编辑器运行时我们可以看到它的窗口结构和资源管理器很像,左边窗格的每个文件夹图标表示一个Key。Key下面还有Subkey。我们习惯上采用文件夹的路径表示法。e.g:HKEY_LOCAL_MACHINE底下的”Software”Subkey表示成HKEY_LOCAL_MACHINE\Software。

2、Value、Value Name、Value Data和Default Value

用Regedit.exe打开HKEY_CLASSES_ROOT\.txt这个Key,在右窗格中显示的是Key的Value,Value可能有很多,对某个特定的Value来将,它有两个属性–Value Name和Value Data,如在此例中,HKEY_CLASSES_ROOT\.txt有一个Value–>”Content Type”,这个Value的Value Name为”Content Type”,Value Data为”text/plain”,某些Key,还有缺省Value–Default Value,如此例中,HKEY_CLASSES_ROOT\.txt这个Key的Default Value就是我们看到的”默认”[Value Name],”txtfile”[Value Data]。

3、存取Registry,先取Key Handle

在了解了Registry的结构之后,接下来的事就是如何存取它了。就像我们存取文件必须指明文件的存取路径[目录]一样,存取Registry必须先指明Key.Key在Regedit.exe中看到的是一长串的字符串,例如: “HKEY_LOCAL_MACHINE\Software\Microsoft\Windows”,

但在Windows内部,每个Key都对应一个Key Handle(等于一个长整数值,程序中通常以hKey表示),Windows之所以要用hkey来代表Key是为了让Registry的存取更有效率,因为整数的操作功能优于字符串,所以我们的首要任务就是取得Key的Key Handle(hKey)取得最上层的hKey。首先是位于最上层的Key,这些Key的hKey是固定不变的,其值如下表所示。

Key hKey(Key Handle)

HKEY_CLASSES_ROOT &H80000000

HKEY_CURRENT_USER &H80000001

HKEY_LOCAL_MACHINE &H80000002

HKEY_USERS &H80000003

HKEY_CURRENT_CONFIG &H80000005

HKEY_DYN_DATA &H80000006

如果想取得上述几个Key的SubKey Handle,可以调用RegOpenKey这个API函数。其详细描述如下:

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函数不太一样]

调用例:

Dim ret As Long, hKey As Long, hKey2 As Long

‘取得”HKEY_LOCAL_MACHINE”底下的”SOFTWARE\Microsoft”这个SubKey Handle.

ret = RegOpenKey(HKEY_LOCAL_MACHINE, “SOFTWARE\Microsoft”, hKey)

If ret = 0 Then ‘If Success

MsgBox “HKLM\SOFTWARE\Microsoft = ” & hKey

End If

‘继续以刚才所取得的”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft”hKey为参数,再取得它的’SubKey”Windows\CurrentVersion”的handle。

ret = RegOpenKey(hKey, “Windows\CurrentVersion”, hKey2)

If ret = 0 Then

MsgBox “HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion = ” & hKey2

End If

相关的两个API函数是:RegCreateKey[建立SubKey]和RegClose[关闭SubKey]

详细说明:

RegCreateKey函数:

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。

RegClose函数:

Declare Function RegCloseKey Lib “advapi32.dll” (ByVal hKey As Long) As Long

当我们不再存取Registry时,将打开或建立的SubKey关闭是一个比较好的习惯,就正如我们在使用C语言的文件打开函数后必须要关闭一样。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注