📄 registry.bas
字号:
Attribute VB_Name = "RegistryFunctions"
Option Explicit
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
Private Const HKEY_PERFORMANCE_DATA = &H80000004
Private Const HKEY_CURRENT_CONFIG = &H80000005
Private Const HKEY_DYN_DATA = &H80000006
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const SYNCHRONIZE = &H100000
Private Const KEY_CREATE_LINK = &H20
Private Const 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))
Private Const REG_OPTION_NON_VOLATILE = 0
Global Const REG_NONE = 0
Global Const REG_SZ = 1
Global Const REG_EXPAND_SZ = 2
Global Const REG_BINARY = 3
Global Const REG_DWORD = 4
Global Const REG_DWORD_LITTLE_ENDIAN = 4 ' Same as REG_DWORD
Global Const REG_DWORD_BIG_ENDIAN = 5
Global Const REG_LINK = 6
Global Const REG_MULTI_SZ = 7
Global Const REG_RESOURCE_LIST = 8
Global Const REG_FULL_RESOURCE_DESCRIPTOR = 9
Global Const REG_RESOURCE_REQUIREMENTS_LIST = 10
Private Const REG_CREATED_NEW_KEY = &H1
Private Const REG_OPENED_EXISTING_KEY = &H2
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 RegEnumValue Lib "advapi32.dll" _
Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex _
As Long, lpValueName As String, lpcbValueName As Long, ByVal _
lpReserved As Long, lpType As Long, lpData As Any, lpcbData As _
Long) As Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" _
Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex _
As Long, lpName As String, lpcbName As Long, ByVal _
lpReserved As Long, lpClass As String, lpcbClass As _
Long, lpftLastWriteTime As Any) 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 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 Any, phkResult _
As Long, lpdwDisposition 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, _
lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" _
Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal _
lpValueName As String) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias _
"RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Sub ConvertValueName(Path As String, ByRef hKey As Long, ByRef Key As String, ValueName As String)
Dim Data As String, bNum As Long
Data = Mid$(Path, 1, InStr(Path, "\") - 1)
Select Case Data
Case "HKEY_CLASSES_ROOT"
hKey = HKEY_CLASSES_ROOT
Case "HKEY_CURRENT_USER"
hKey = HKEY_CURRENT_USER
Case "HKEY_LOCAL_MACHINE"
hKey = HKEY_LOCAL_MACHINE
Case "HKEY_USERS"
hKey = HKEY_USERS
Case "HKEY_PERFORMANCE_DATA"
hKey = HKEY_PERFORMANCE_DATA
Case "HKEY_CURRENT_CONFIG"
hKey = HKEY_CURRENT_CONFIG
Case "HKEY_DYN_DATA"
hKey = HKEY_DYN_DATA
End Select
bNum = 1
Do Until InStr(bNum, Path, "\") = 0
bNum = InStr(bNum, Path, "\") + 1
Loop
On Error Resume Next
Key = Mid$(Path, Len(Data) + 2, bNum - 2 - (Len(Data) + 1))
ValueName = Mid$(Path, bNum)
On Error GoTo 0
End Sub
Function GetReg(Path As String, Optional Default)
Attribute GetReg.VB_Description = "Reads a value from the registry."
Dim hKey As Long, kHandle As Long, Key As String, ValueName As String, Data As String, vLen As Long, vType As Long, NumData As Long
ConvertValueName Path, hKey, Key, ValueName
If RegOpenKeyEx(hKey, Key, 0&, KEY_QUERY_VALUE, kHandle) = 0 Then
If RegQueryValueEx(kHandle, ValueName, 0&, vType, ByVal 0&, vLen) = 0 Then
Data = String$(vLen, Chr$(0))
If vType = REG_DWORD Or vType = REG_DWORD_BIG_ENDIAN Then
If RegQueryValueEx(kHandle, ValueName, 0&, 0&, NumData, vLen) = 0 Then
GetReg = NumData
End If
Else
If RegQueryValueEx(kHandle, ValueName, 0&, 0&, ByVal Data, vLen) = 0 Then
If vType = REG_SZ Or vType = REG_EXPAND_SZ Or vType = REG_MULTI_SZ Then
Data = Left$(Data, vLen - 1)
If Data <> "" Then GetReg = Data
Else
GetReg = Data
End If
End If
End If
End If
RegCloseKey kHandle
If Not IsEmpty(GetReg) Then Exit Function
End If
If Not IsError(Default) Then GetReg = Default
End Function
Function GetRegType(Path As String) As Long
Dim hKey As Long, kHandle As Long, Key As String, ValueName As String, Data As String, vLen As Long, vType As Long
ConvertValueName Path, hKey, Key, ValueName
If RegOpenKeyEx(hKey, Key, 0&, KEY_QUERY_VALUE, kHandle) = 0 Then
If RegQueryValueEx(kHandle, ValueName, 0&, vType, ByVal 0&, ByVal 0&) Then
GetRegType = vType
End If
RegCloseKey kHandle
End If
End Function
Function EnumReg(ByVal Path As String, Index As Long) As String
Dim hKey As Long, kHandle As Long, Key As String, ValueName As String, Data As String, vLen As Long
If Right$(Path, 1) <> "\" Then Path = Path + "\"
ConvertValueName Path, hKey, Key, ValueName
ValueName = ""
If RegOpenKeyEx(hKey, Key, 0&, KEY_QUERY_VALUE, kHandle) = 0 Then
vLen = 255
Data = String$(255, Chr$(0))
If RegEnumValue(kHandle, Index, ByVal Data, vLen, 0&, 0&, ByVal 0&, 0&) = 0 Then
Data = Left$(Data, vLen)
If Data = String$(255, Chr$(0)) Then Data = ""
EnumReg = Data
End If
RegCloseKey kHandle
End If
End Function
Function EnumKey(ByVal Path As String, Index As Long) As String
Dim hKey As Long, kHandle As Long, Key As String, ValueName As String, Data As String, vLen As Long
If Right$(Path, 1) <> "\" Then Path = Path + "\"
ConvertValueName Path, hKey, Key, ValueName
ValueName = ""
If RegOpenKeyEx(hKey, Key, 0&, KEY_ENUMERATE_SUB_KEYS, kHandle) = 0 Then
vLen = 255
Data = String$(255, Chr$(0))
If RegEnumKeyEx(kHandle, Index, ByVal Data, vLen, 0&, ByVal 0&, 0&, ByVal 0&) = 0 Then
Data = Left$(Data, vLen)
If Data = String$(255, Chr$(0)) Then Data = ""
EnumKey = Data
End If
RegCloseKey kHandle
End If
End Function
Sub MultiStringToArray(MultiString As String, ByRef StrArray() As String)
Dim cNum As Long, cNum2 As Long
ReDim StrArray(0)
For cNum = 1 To Len(MultiString)
cNum2 = InStr(cNum, MultiString, Chr(0))
If cNum2 = 0 Then cNum2 = Len(MultiString) + 1
ReDim Preserve StrArray(UBound(StrArray) + 1)
StrArray(UBound(StrArray)) = Mid$(MultiString, cNum, cNum2 - cNum)
cNum = cNum2
Next cNum
End Sub
Sub ArrayToMultiString(StrArray() As String, ByRef MultiString As String)
Dim sNum As Long
MultiString = ""
For sNum = 1 To UBound(StrArray)
MultiString = MultiString + StrArray(sNum) + Chr$(0)
Next sNum
End Sub
Sub NewKey(ByVal Path As String, Optional Default, Optional vType)
Attribute NewKey.VB_Description = "Creates a new key in the registry."
Dim hKey As Long, kHandle As Long, Key As String, ValueName As String, Temp As Long, Setg As String, NumData As Long
If Right$(Path, 1) <> "\" Then Path = Path + "\"
ConvertValueName Path, hKey, Key, ValueName
ValueName = ""
If RegCreateKeyEx(hKey, Key, 0&, 0&, REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY Or KEY_SET_VALUE, ByVal 0&, kHandle, Temp) = 0 Then
If Not IsError(Default) Then
If IsError(vType) Then vType = REG_SZ
If vType = REG_DWORD Or vType = REG_DWORD_BIG_ENDIAN Then
NumData = Default
RegSetValueEx kHandle, ValueName, 0&, vType, NumData, 4
Else
Setg = Default
If vType = REG_SZ Or vType = REG_EXPAND_SZ Or vType = REG_MULTI_SZ Then _
Setg = Setg + Chr$(0)
RegSetValueEx kHandle, ValueName, 0&, vType, ByVal Setg, Len(Setg)
End If
End If
RegCloseKey kHandle
End If
End Sub
Sub SetReg(Path As String, NewValue, Optional vType)
Attribute SetReg.VB_Description = "Writes a value to the registry."
Dim hKey As Long, kHandle As Long, Key As String, ValueName As String, Setg As String, NumData As Long
ConvertValueName Path, hKey, Key, ValueName
If RegOpenKeyEx(hKey, Key, 0&, KEY_SET_VALUE, kHandle) = 0 Then
If IsError(vType) Then vType = REG_SZ
If vType = REG_DWORD Or vType = REG_DWORD_BIG_ENDIAN Then
NumData = NewValue
RegSetValueEx kHandle, ValueName, 0&, vType, NumData, 4
Else
Setg = NewValue
If vType = REG_SZ Or vType = REG_EXPAND_SZ Or vType = REG_MULTI_SZ Then _
Setg = Setg + Chr$(0)
RegSetValueEx kHandle, ValueName, 0&, vType, ByVal Setg, Len(Setg)
End If
RegCloseKey kHandle
End If
End Sub
Sub DelReg(Path As String)
Attribute DelReg.VB_Description = "Deletes a value from the registry."
Dim hKey As Long, kHandle As Long, Key As String, ValueName As String
ConvertValueName Path, hKey, Key, ValueName
If RegOpenKeyEx(hKey, Key, 0&, KEY_SET_VALUE, kHandle) = 0 Then
RegDeleteValue kHandle, ValueName
RegCloseKey kHandle
End If
End Sub
Sub DelKey(ByVal Path As String)
Attribute DelKey.VB_Description = "Deletes a key from the registry."
Dim hKey As Long, Key As String, Data As String
If Right$(Path, 1) <> "\" Then Path = Path + "\"
ConvertValueName Path, hKey, Key, Data
RegDeleteKey hKey, Key
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -