' 若是 REG_MULTI_SZ 类型资料, 需使用 Chr(0) 将多个字串串起来
ret = SetValue(hKey, \REG_MULTI_SZ, \) ' 以上叁种呼叫方式均省略了 lenValue 参数
' REG_BINARY 类型资料, Value 参数应传入 Byte 阵列, lenValue 参数则传入资料长度 Dim bArr(0 To 20) As Byte
ret = SetValue(hKey, \REG_BINARY, bArr, 21) ◆ RegDeleteValue API:删除特定 Value
除了笔者所提供的 Value 存取函数之外, 您可能还需要使用 API 函数中的 RegDeleteValue 来删除 Value, 此一函数很容易使用, 所以笔者不再提供封装版的 VB 函数, 它含有两个参数, 意义如下: (1) ByVal hKey As Long:Key Handle。
(2) ByVal lpValueName As String:Value 的名称, 若传入 \,则表示删除 Default Value 的内容。 若呼叫成功, 则函数传回 0, 与其他登录资料库 API 的惯例相同。 存取 Value 的范例
本段落最後让我们来参考一个比较完整的范例程式, 请开启下载档案中的 value.vbp 专案, 此一程式启动时, 会在 \Subkey 底下写入以下 Value:
资料类型 名称 资料 (预设值) StringData kj Registry Master 这是字串 字串一(0) +字串二+Chr(0) +Chr(0) REG_SZ REG_MULTI_SZ MultiString REG_DWORD REG_BINARY LongData 99999 BinaryData 11 22 33 44 AA BB CC DD 此时会使用到 SetDefaultValue 及 SetValue 函数, 接着当您按下「显示所有 Value」命令钮时, 如图-5, 程式会读出来所有 Value 并且显示在 ListBox 之中,此时会呼叫 GetValueByIndex 函数。
图-5 存取 Value 的范例:value.vbp
最後当程式结束时, 则会删除以上所有的 Value, 此时会呼叫 GetValueByIndex 函数及 RegDeleteValue API 函数, 完整的程式如下: Private Sub Form_Load() Dim hKey As Long, ret As Long
ret = SetDefaultValue(HKEY_LOCAL_MACHINE, \\Registry Master\ret = RegOpenKey(HKEY_LOCAL_MACHINE, \hKey) ret = SetValue(hKey, \REG_SZ, \这是字串\
ret = SetValue(hKey, \REG_MULTI_SZ, \字串一\+ Chr(0) + \字串二\+ Chr(0)) ret = SetValue(hKey, \REG_DWORD, 99999)
ret = SetValue(hKey, \REG_BINARY, Array(&H11, &H22, &H33, &H44, &HAA, &HBB, &HCC, &HDD), 8) Call RegCloseKey(hKey)
MsgBox \已写入资料到登录资料库中,您可以开启 RegEdit 加以检查!\End Sub
Private Sub Command1_Click() ' 显示所有 Value
Dim Index As Long, ret As Long, hKey As Long Dim bArr() As Byte, Name As String, vType As Long
ret = RegOpenKey(HKEY_LOCAL_MACHINE, \hKey) ret = GetValueByIndex(hKey, Index, Name, bArr, vType) While ret
If Len(Name) = 0 Then Name = \预设 值)\
List1.AddItem Name & vbTab & ValueOutput(bArr, vType) Index = Index + 1
ret = GetValueByIndex(hKey, Index, Name, bArr, vType) Wend
Call RegCloseKey(hKey) End Sub
Private Sub Form_Unload(Cancel As Integer) Dim Index As Long, ret As Long, hKey As Long Dim bArr() As Byte, Name As String, vType As Long
ret = RegOpenKey(HKEY_LOCAL_MACHINE, \hKey) ret = GetValueByIndex(hKey, Index, Name, bArr, vType) While ret
Call RegDeleteValue(hKey, Name)
' 不可以执行 Index = Index + 1,因为 Index = 0 的 Value 已删除, ' 後面的 Index 向前递减, 所以 Index = 0 又可以读到 Value, ' 其实在这一个 While 回圈中, 您可以将 Index 变数改成 0 ret = GetValueByIndex(hKey, Index, Name, bArr, vType) Wend
Call RegCloseKey(hKey)
MsgBox \的 Value 已删除, 利用 RegEdit 检查时, 记得要先执行功能的「检视/重新整理」!\End Sub Key 的存取
相对於 Value 的存取, Key 的存取要简单得多, Windows 所提供的 API 函数有 RegCreateKey(建立 Subkey)、RegEnumKey(逐一列举 Subkey)、RegDeleteKey(删除 Key 或 Subkey), 而笔者也仿效 Value 的存取函数, 提供了 GetSubkeyByIndex 替代比较不容易使用的 RegEnumKey, 至於 RegCreateKey 及 RegDeleteKey, 由於比较简单,所以直接呼叫即可, 以下就让笔者来说明这几个函数的用法。 RegCreateKey API 函数:建立 Subkey
RegCreateKey 的用法与 RegOpenKey 完全相同, 所不同的是 RegOpenKey 只能开启既有的 Subkey, 而 RegCreateKey 则可以建立 Subkey, 比较特别的是, 如果呼叫 RegCreateKey 所建立的 Subkey 是一个已存在的 Subkey, 则 RegCreateKey 的作用与 RegOpenKey 相同, 由於 RegCreateKey 具有以上的特性, 很多人乾脆就不用 RegOpenKey 了,而不管开启或建立 Subkey, 都一概使用 RegCreateKey。 GetSubkeyByIndex 函数:读取任意 Subkey 此一函数的定义如下:
Function GetSubkeyByIndex(ByVal hKey As Long, ByVal Index As Long, KeyName As String) As Boolean
如果已经了解之前存取 Value 的 GetValueByIndex 函数, 应该不难了解此一函数的用法,假设我们想列举 \的所有 Subkey, 则程式大致如下: Dim ret As Long, hKey As Long, Index As Integer, Name As String
ret = RegOpenKey(HKEY_LOCAL_MACHINE, \hKey) While GetSubkeyByIndex(hKey, Index, Name) Debug.Print Name ' 印出 Subkey Name Index = Index + 1 Wend
RegDeleteKey API:删除 Key 或 Subkey RegDeleteKey 函数含有两个参数:
(1) ByVal hKey As Long:Key Handle。
(2) ByVal lpSubkey As String:Subkey 的字串, 若传入 \,表示删除 Key。
请注意当我们利用 RegDeleteKey 删除某一个含有 Subkey 的 Key 或 Subkey 时(假设 \MACHINE\\kj\含有 \Subkey,则删除 \即属於此一情况), 对於 Windows 95 或 NT 来说, 结果是不相同的, Windows 95 会将此一 Key(或 Subkey) 及其所有 Subkey 全数删除, 而 Windows NT 则传回失败值。
为了能够让 Windows NT 也具备 Windows 95 删除所有 Subkey 的功能, 笔者提供了另一个 VB 函数: Function DeleteSubkeyTree(ByVal hKey As Long, ByVal Subkey As String) As Boolean
此一函数会呼叫 GetSubkeyByIndex 再向下读取所有的 Subkey, 然後一一将它们删除,程式的内容如下: Function DeleteSubkeyTree(ByVal hKey As Long, ByVal Subkey As String) As Boolean Dim ret As Long, Index As Long, Name As String Dim hSubKey As Long
ret = RegOpenKey(hKey, Subkey, hSubKey) ' 取得 Subkey 的 Handle If ret <> 0 Then DeleteSubkeyTree = False Exit Function End If
ret = RegDeleteKey(hSubKey, \
If ret <> 0 Then ' 失败,表示此一 Subkey 的下一层还有 Subkey While GetSubkeyByIndex(hSubKey, 0, Name) And _
DeleteSubkeyTree(hSubKey, Name) ' 递回删除 Subkey 的 Subkey Wend
ret = RegDeleteKey(hSubKey, \End If
DeleteSubkeyTree = (ret = 0)