别用RegSetValueExString!
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
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
梦里水乡 登录数据库Registry的Value的存取--读取某个Key指定名称的值我们在这篇文章中将讲述利用RegQueryValueEx函数来读取某个Key的指定名称的值(value)
RegQueryValueEx的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 先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度,只需要将参数lpData设置为vbNullString[表示暂时不读取数据],然后由参数lpType获得数据类型,lpcbData获得数据长度。调用例子如下:
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
在得到某个value的数据类型和数据长度后,我们将根据不同的数据类型进行不同的处理。下面分别叙述之。a-->数据类型为REG_SZ
这种方式最简单,只需要在上面的语句结束之后使用以下语句就可以得到正确的字符串。eg:
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)
S=String(lenData,Chr(0))
RegQueryValueEx hKey, Name, 0, typeData, ByVal S, lenData '注意ByVal千万别忘了
S=Left(S,InStr(S,Chr(0))-1) b-->数据类型为REG_EXPAND_SZ
所谓REG_EXPAND_SZ类型的字符串是指字符串中可能含有%WinDir%之类的字符串[%WinDir%表示Windows所在目录我们可以在Ms-Dos方式下使用set命令来看看这类字符串,我们也许还会看到诸如TMP,PATH,WINBOOTDIR这些和WinDir类似的具有特殊意义的字符串。],遇到这类字符串,我们还必须调用另一个API函数ExpandEnvironmentStrings来将它展开[比如%WinDir%就展开为C:\WINDOWS]。以下是ExpandEnvironmentStrings的描述和用法:
Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsA" (ByVal lpSrc As String, ByVal lpDst As String, ByVal nSize As Long) As Long
参数 类型及说明
lpSrc String,欲扩充的字串
lpDst String,扩充过后的字串
nSize Long,lpDst的长度。
注意预先对lpDst进行初始化,使其与这个长度相符
函数调用例:
Dim S2 As String
'先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)
S = String(lenData, Chr(0))
RegQueryValueEx hKey, Name, 0, typeData, ByVal S, lenData
S = Left(S, InStr(S, Chr(0)) - 1) 'S为读取出来的字符串
S2 = String(Len(S) + 256, Chr(0))'S2为扩展之后的字符串
ExpandEnvironmentStrings S, S2, Len(S2)
S2= Left(S2, InStr(S2, Chr(0)) - 1)c-->数据类型为REG_MULTI_SZ
REG_MULTI_SZ为多重字符串,其结构如下: 字符串1 chr(0) 字符串2 chr(0) ... 字符串N chr(0) chr(0) 下面的自定义子程序的功能是取得多重字符串中每一个字符串。
Sub MultiStringToStringArray(S As String, S2() As String)
'S为我们读取出来的多重字符串
'S2为转换后的字符串数组
Dim count As Integer, pos As Integer, pos2 As Integer, idx As Integer
pos = InStr(S, Chr(0))While pos > 0 count = count + 1
pos = InStr(pos + 1, S, Chr(0))
Wend
'取得多重字符串中的字符串个数
count = count - 1 ReDim S2(0 To count - 1)
pos = 1
For idx = 0 To count - 1
pos2 = InStr(pos, S, Chr(0))
S2(idx) = Mid(S, pos, pos2 - pos)
pos = pos2 + 1
Next
End Sub
在调用MultiStringToStringArray之前,要先定义一个不含任何元素的字符串数组。子程序调用例子如下:
S= "WGL"+chr(0)+"LOVE"+chr(0)+"MEISHAN"+chr(0)+chr(0)
Dim S2() As String
MultiStringToStringArray S,S2
那么执行之后,S2(0)="WGL",S2(1)="LOVE",S2(2)="MEISHAN"
d-->数据类型为REG_DWORD,REG_DWORD_BIG_ENDIAN
'先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度
Dim L As Long
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)
RegQueryValueEx hKey, Name, 0, typeData, L, lenDatae-->数据类型为REG_BINARY
'先利用RegQueryValueEx函数获得某个value的数据类型和数据的长度
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)
ReDim bArr(0 To lenData - 1) As Byte
RegQueryValueEx hKey, Name, 0, typeData, bArr(0), lenData 一个完整的例子请下载后自行研究。
GetValue = 1
SetValue = 2
DeleteKey = 3
End Enum
'注册表的读写 读:返回读出的值 写/删:返回“0”表示成功,否则为写/删失败
'删除时,如果str_SetValue的值为1表示删除 注册表的项
Public Function fun_RegControlA(ByVal lng_Keymain As Long, ByVal str_Key As String, _
str_ValueKey As String, ByVal lng_ValueType As Long, ByVal lng_Set As Long, Optional ByVal str_SetValue As String) As String
'lng_Keymain 主键
'str_Key 子键
'str_ValueKey 子键中要操作的 键名
'lng_ValueType 子键中要操作的键名的类型
'lng_Set 读、写、删
'str_setvalue 要写入的值
On Error GoTo doError
Dim hKey As Long
Dim lpSubKey As String
Dim lpSecurityattributes As SECURITY_ATTRIBUTES
Dim phkResult As Long
Dim lpdwDisposition As Long
Dim lpValueName As String
Dim lpType As Long
Dim lpData As String
Dim lpcbData As Long
Dim dwType As Long
Dim cbData As Long
Dim lng_Ret As Long
Dim str_Ret As String
Dim lng_Temp As Long
Dim int_I As Integer
hKey = lng_Keymain
lpSubKey = str_Key
With lpSecurityattributes
.nLength = Len(lpSecurityattributes)
.bInheritHandle = True
.lpSecurityDescriptor = 0
End With
lng_Ret = RegCreateKeyEx(hKey, lpSubKey, 0, "", 0, KEY_ALL_ACCESS, lpSecurityattributes, phkResult, lpdwDisposition)
If lng_Ret = ERROR_SUCCESS Then
hKey = phkResult
If lng_Set = GetValue Then
lpType = lng_ValueType
lpValueName = str_ValueKey
lpData = Space$(100)
lpcbData = 100
If lng_Ret = ERROR_SUCCESS Then
Select Case lpType
Case 1 'REG_SZ
lng_Ret = RegQueryValueEx(hKey, lpValueName, 0, lpType, ByVal lpData, lpcbData)
int_I = InStr(1, lpData, Chr(0))
If int_I > 1 Then
str_Ret = Left$(lpData, int_I - 1)
Else
str_Ret = ""
End If
Case 3 'REG_BINARY
lng_Ret = RegQueryValueEx(hKey, lpValueName, 0, lpType, int_I, 4)
str_Ret = CStr(int_I)
Case 4 'REG_DWORD
lng_Ret = RegQueryValueEx(hKey, lpValueName, 0, lpType, lng_Temp, 4)
str_Ret = CStr(lng_Temp)
Case Else
str_Ret = ""
End Select
Else
str_Ret = ""
End If
ElseIf lng_Set = SetValue Then
lpValueName = str_ValueKey
dwType = lng_ValueType
lpData = str_SetValue
If lpData = "" Then
lng_Ret = 1
Else
Select Case dwType
Case 1 'REG_SZ
cbData = LenB(StrConv(str_SetValue, vbFromUnicode))
lng_Ret = RegSetValueEx(hKey, lpValueName, 0, dwType, ByVal lpData, cbData)
Case 3 'REG_BINARY
lng_Temp = Val(lpData)
If lng_Temp > (2 ^ 8 - 1) Or lng_Temp < 0 Then
lng_Ret = 1
Else
lng_Ret = RegSetValueEx(hKey, lpValueName, 0, dwType, CByte(lng_Temp), 4)
End If
Case 4 'REG_DWORD
lng_Temp = Val(lpData)
If lng_Temp > (2 ^ 32 - 1) Or lng_Temp < 0 Then
lng_Ret = 1
Else
lng_Ret = RegSetValueEx(hKey, lpValueName, 0, dwType, lng_Temp, 4)
End If
Case Else
lng_Ret = 1
End Select
End If
If lng_Ret = ERROR_SUCCESS Then str_Ret = "0"
ElseIf lng_Set = DeleteKey Then
lpValueName = str_ValueKey
If str_SetValue <> "1" Then
lng_Ret = RegDeleteValue(hKey, lpValueName)
If lng_Ret = ERROR_SUCCESS Then str_Ret = "0"
Else '删除项
lng_Ret = RegDeleteKey(hKey, lpValueName)
If lng_Ret = ERROR_SUCCESS Then str_Ret = "0"
End If
End If
End If
lng_Ret = RegCloseKey(hKey)
fun_RegControlA = str_Ret
Exit Function
doError:
RegCloseKey hKey
fun_RegControlA = ""
End Function
其他人知道的也可回答!
(估计 daviddivad 得 60~70分 ,贴网页的(第一位)得 10 分 ,剩下的分配!)
说实话
碰见这样的人真的好想吐血
刚才差点把这个贴子删了
你那句“谁没有不会的时候”真的好打击我啊我当初就是靠注册表起家的:
http://expert.csdn.net/Expert/topic/698/698548.xml?temp=.1530268
现在问问题的人的素质越来越差了
自己不想清楚就说别人这里那里不对(另一个范例:)
自己也不想想程序怎么写
到底是自己写程序还是要别人写啊当初我一看见标题就分辨出楼主是这样的人
故意只给他参考资料,让他自己多想想
没想到他居然这样
fun_RegControlA(HKEY_CLASSES_ROOT, "", "ss", REG_BINARY, SetValue, 149)--------------------------------------------------------------------------------
问一下 daviddivad: CByte(lng_Temp) 如何使注册表键值为 95 00 00 00 (二进制值)
RegSetValueEx hKey, 值名, 0, REG_BINARY, Byte数组(最小下标), 长度
可以加20!
我的 使注册表键值为 95 00 00 00 (二进制值)答案不要了,我解决了!
以前的文章访问不了所以顺便复制了