您的位置:首页 > 编程语言 > VB

VB读写注册表

2009-09-26 13:55 106 查看
Option Explicit

Public Enum ERROR
ERROR_SUCCESS = 0&
ERROR_BADDB = 1009&
ERROR_BADKEY = 1010&
ERROR_CANTOPEN = 1011&
ERROR_CANTREAD = 1012&
ERROR_CANTWRITE = 1013&
ERROR_OUTOFMEMORY = 14&
ERROR_INVALID_PARAMETER = 87&
ERROR_ACCESS_DENIED = 5&
ERROR_NO_MORE_ITEMS = 259&
ERROR_MORE_DATA = 234&
End Enum

Public Enum KEYTYPE
REG_SZ = 1&
REG_EXPAND_SZ = 2&
REG_BINARY = 3
REG_DWORD = 4&
End Enum

Public Enum MAINKEY
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_CONFIG = &H80000005
HKEY_USERS = &H80000003
End Enum

Private Const READ_CONTROL = &H20000
Private Const WRITE_DAC = &H40000
Private Const WRITE_OWNER = &H80000

Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)

Private Const SYNCHRONIZE = &H100000

Public Enum KEYMODE
KEY_QUERY_VALUE = &H1
KEY_NOTIFY = &H10
KEY_CREATE_LINK = &H20
KEY_CREATE_SUB_KEY = &H4
KEY_ENUMERATE_SUB_KEYS = &H8
KEY_EVENT = &H1     '  Event contains key event record
KEY_SET_VALUE = &H2
KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))
KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
End Enum

Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Private 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
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long
Private 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
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Declare Function RegSetValueExA Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Long, ByVal cbData As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Private Declare Function RegDeletevalue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal lpSecurityAttributes As Long) As Long
Private Declare Function RegRestoreKey Lib "advapi32.dll" Alias "RegRestoreKeyA" (ByVal hKey As Long, ByVal lpFile As String, ByVal dwFlags As Long) As Long

Public Function GetValue(ByVal hKey As MAINKEY, ByVal subKey As String, ByVal keyItem As String, ByRef keyValue As Variant) As Long
Dim kLength As Long, kBuffer As String * 255, kHandle As Long, kType As Long, kData As Long
Dim rtn As Long
'取得KEY的句柄
rtn = RegOpenKeyEx(hKey, subKey, 0, KEY_READ, kHandle)
If rtn <> ERROR.ERROR_SUCCESS Then
GetValue = rtn
Exit Function
End If

'取得KEY的类型
rtn = RegQueryValueEx(kHandle, keyItem, 0, kType, ByVal 0, kLength)
GetValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If

'根据KEY的类型取值
Select Case kType
Case KEYTYPE.REG_SZ     '字符串
rtn = RegQueryValueEx(kHandle, keyItem, 0, kType, ByVal kBuffer, kLength)
GetValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
keyValue = Left(kBuffer, InStr(kBuffer, Chr(0)) - 1)

Case KEYTYPE.REG_EXPAND_SZ  '字符串
rtn = RegQueryValueEx(kHandle, keyItem, 0, kType, ByVal kBuffer, kLength)
GetValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
keyValue = Left(kBuffer, InStr(kBuffer, Chr(0)) - 1)

Case KEYTYPE.REG_DWORD      '双字
rtn = RegQueryValueEx(kHandle, keyItem, 0, kType, kData, kLength)
GetValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
keyValue = kData
Case KEYTYPE.REG_BINARY     '二进制
rtn = RegQueryValueEx(kHandle, keyItem, 0, kType, kData, kLength)
GetValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
keyValue = kData
End Select
RegCloseKey kHandle
End Function

Public Function DeleteValue(ByVal hKey As MAINKEY, ByVal subKey As String, keyItem As String) As Long
Dim kHandle As Long, rtn As Long
rtn = RegOpenKeyEx(hKey, subKey, 0, KEYMODE.KEY_WRITE, kHandle)
DeleteValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If

rtn = RegDeletevalue(kHandle, keyItem)
DeleteValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If

RegCloseKey kHandle

End Function

Public Function DeleteKey(ByVal hKey As MAINKEY, ByVal subKey As String, ByVal delKey As String) As Long
Dim kHandle As Long, rtn As Long
rtn = RegOpenKeyEx(hKey, subKey, 0, KEYMODE.KEY_WRITE, kHandle)
DeleteKey = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If

rtn = RegDeleteKey(kHandle, delKey)
DeleteKey = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If

RegCloseKey kHandle

End Function

Public Function AddValue(ByVal hKey As MAINKEY, ByVal subKey As String, ByVal KItem As String, ByVal vType As KEYTYPE, ByVal Value As Variant) As Long
Dim kHandle As Long, rtn As Long, cResult As Long

Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)
sa.lpSecurityDescriptor = 0
sa.bInheritHandle = True

rtn = RegOpenKeyEx(hKey, subKey, 0, KEYMODE.KEY_WRITE, kHandle)
If rtn <> ERROR.ERROR_SUCCESS Then
rtn = RegCreateKeyEx(hKey, subKey, 0, "", 0, KEYMODE.KEY_WRITE, sa, kHandle, cResult)
AddValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
End If

Select Case vType
Case KEYTYPE.REG_BINARY
rtn = RegSetValueExA(kHandle, KItem, 0, vType, Value, Len(Value))
AddValue = rtn
If rtn <> ERROR_SUCCESS Then
Exit Function
End If
Case KEYTYPE.REG_DWORD
rtn = RegSetValueExA(kHandle, KItem, 0, vType, Value, 4)
AddValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
Case KEYTYPE.REG_EXPAND_SZ
Value = StrConv(Value, vbUnicode)
rtn = RegSetValueEx(kHandle, KItem, 0, vType, StrConv(Value, vbFromUnicode), Len(Value))
AddValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
Case KEYTYPE.REG_SZ
Value = StrConv(Value, vbUnicode)
rtn = RegSetValueEx(kHandle, KItem, 0, vType, StrConv(Value, vbFromUnicode), Len(Value))
AddValue = rtn
If rtn <> ERROR.ERROR_SUCCESS Then
Exit Function
End If
End Select

RegCloseKey kHandle
End Function
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: