📄 10.txt
字号:
ret = GetValue(hKey, Name, bArr, vType)
Debug.Print ValueOutput( bArr, vType ) ' 将读取的资料显示出来
Function ValueOutput(bArr() As Byte, ByVal vType As Long) As String
Dim S As String, S2 As String, length As Integer, L As Long
Dim i As Integer, sArr() As String
Select Case vType
Case REG_SZ, REG_EXPAND_SZ
ByteArrayToString bArr, S
' 呼叫 ExpandEnvironmentStrings
S2 = String(Len(S) + 256, Chr(0))
length = ExpandEnvironmentStrings(S, S2, Len(S2))
S = Left(S2, length - 1)
ValueOutput = "Type=String, Data=" & S
Case REG_MULTI_SZ
ByteArrayToMultiString bArr, sArr
ValueOutput = "Type=MultiString, Data="
For i = LBound(sArr) To UBound(sArr)
ValueOutput = ValueOutput & sArr(i) & ", "
Next i
Case REG_DWORD, REG_DWORD_BIG_ENDIAN
ByteArrayToLong bArr, L
ValueOutput = "Type=Long, Data=" & L
Case REG_BINARY
ValueOutput = "Type=Byte Array, Data="
For i = LBound(bArr) To UBound(bArr)
ValueOutput = ValueOutput + Format(Hex(bArr(i)), "00")
Next i
End Select
End Function
◆ GetValueByIndex 函数:读取任意Value
GetDefaultValue 可读取 Default Value, GetValue 可读取特定名称的 Value,但如果我们不知道 Value 的名称而想读取某一 Key(或 Subkey) 的所有 Value(包含 Default Value), 则必须使用 GetValueByIndex。
GetValueByIndex 的函数定义是:
Function GetValueByIndex(ByVal hKey As Long, ByVal Index As Long, Name As String, Value() As Byte, vType As Long) As Boolean
与 GetValue 不同的是:GetValue 需传入 ValueName 参数, 而 GetValueByIndex 则是传入 Index, Index 的值是 0~N, 若要读取所有的 Value, 则程式大致如下:
Index = 0
Do
ret = GetValueByIndex( hKey, Index, Name, bArr, vType )
Index = Index + 1
Loop Until Not ret
也就是从 0、1、2…开始读取 Value 的内容, 直到 GetValueByIndex 传回 False 时, 即表示读取了所有的 Value。
就像 GetValue 会传回 Byte 阵列(Value() As Byte 参数) 及资料类型(vType As Long 参数)一样, GetValueByIndex 也会传回 Byte 阵列及资料类型, 但重要的是 GetValueByIndex 还会传回 Value 的名称(Name 参数), 而为了区分 GetValueByIndex 所读取的是 Default Value 还是特定名称的 Value(注:Default Value 的 Index 不一定等於 0), 程式必须判断读回的 Name 参数, 若 Name 参数等於 "",则表示此一 Index 为 Default Value。以下是利用 GetValueByIndex 读取某一 Key(或 Subkey) 所有 Value 并且加以显示的范例程式:
Dim hKey As Long, Index As Long, Name As String
Dim bArr() As Byte, vType As Long, ret As Boolean
Index = 0
Do
ret = GetValueByIndex( hKey, Index, Name, bArr, vType )
If ret Then
If Name = "" Then Name = "(预设值)"
Debug.Print "Name=" & Name & ", " & ValueOutput( bArr, vType )
Index = Index + 1
End If
Loop Until Not ret
◆ SetDefaultValue 函数:写入Default Value
SetDefaultValue 是与 GetDefaultValue 相对应的函数, 前者用来写入资料,後者则是读取资料, 两者除了读取与写入的差别之外, 使用方法与参数定义则完全相同。
比较值得注意的事情是, 当我们想写入某一个 Subkey 的 Default Value 时,若此一 Subkey 不存在, 则 Windows 会自动建立此一 Subkey, 然後才写入 Default Value, 假设 "HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry" Subkey 并不存在, 则以下叙述:
ret = SetDefaultValue(HKEY_LOCAL_MACHINE, "SOFTWARE\kj\Registry", "kj Registry Master")
会先建立以下两个 Subkey:(HKEY_LOCAL_MACHINE\SOFTWARE 为已存在的 Subkey)
HKEY_LOCAL_MACHINE\SOFTWARE\kj
HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry
然後才写入 "kj Registry Master" 到 "HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry" Subkey 的 Default Value。
◆ SetValue 函数:写入特定Value
SetDefaultValue 用来写入 Default Value, 而 SetValue 则用来写入特定名称的 Value, 它的函数定义如下:
Function SetValue(ByVal hKey As Long, ByVal ValueName As String, ByVal vType As Long, Value As Variant, Optional ByVal lenValue As Integer) As Boolean
比较特别的参数是 Value 及 lenValue, 其中 Value 参数所定义的型别是 Variant(不定型),表示可以接受任何型别的资料, 而 lenValue 参数则以 Optional 的方式来宣告,表示可以省略。在使用上, 如果呼叫 SetValue 时所设定的是长整数或字串资料,则 lenValue 参数可以省略, 因为长整数与字串都可以由程式自己取得长度(长整数的长度是 4, 字串的长度则是利用 Len(字串) 来取得), 因此只有设定 REG_BINARY 类型的资料时,才需要设定 lenValue 参数, 以下是几种典型的呼叫方式:
' REG_SZ 类型资料, Value 参数传入字串
ret = SetValue(hKey, "String", REG_SZ, "String Data")
' REG_DWORD 类型资料, Value 参数传入长整数
ret = SetValue(hKey, "Dword", REG_DWORD, 99999)
' 若是 REG_MULTI_SZ 类型资料, 需使用 Chr(0) 将多个字串串起来
ret = SetValue(hKey, "MultiString", REG_MULTI_SZ, "Str1"+Chr(0)+"Str2"+Chr(0) )
' 以上叁种呼叫方式均省略了 lenValue 参数
' REG_BINARY 类型资料, Value 参数应传入 Byte 阵列, lenValue 参数则传入资料长度
Dim bArr(0 To 20) As Byte
ret = SetValue(hKey, "Binary", 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 专案, 此一程式启动时, 会在 "HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry" Subkey 底下写入以下 Value:
资料类型 名称 资料
(预设值) kj Registry Master
REG_SZ StringData 这是字串
REG_MULTI_SZ MultiString 字串一(0) +字串二+Chr(0) +Chr(0)
REG_DWORD LongData 99999
REG_BINARY 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, "SOFTWARE\kj\Registry", "kj Registry Master")
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\kj\Registry", hKey)
ret = SetValue(hKey, "StringData", REG_SZ, "这是字串")
ret = SetValue(hKey, "MultiString", REG_MULTI_SZ, "字串一" + Chr(0) + "字串二" + Chr(0))
ret = SetValue(hKey, "LongData", REG_DWORD, 99999)
ret = SetValue(hKey, "BinaryData", 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -