ExcelFans

[清者自清]

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
Option Explicit
'注册表主键
Public Enum enumRegMainKey
   iHKEY_CURRENT_USER 
= &H80000001
   iHKEY_LOCAL_MACHINE 
= &H80000002
   iHKEY_CLASSES_ROOT 
= &H80000000
   iHKEY_CURRENT_CONFIG 
= &H80000005
   iHKEY_USERS 
= &H80000003
End Enum
'注册表数据类型
Public Enum enumRegSzType
   iREG_SZ 
= &H1
   iREG_EXPAND_SZ 
= &H2
   iREG_BINARY 
= &H3
   iREG_DWORD 
= &H4
   iREG_NONE 
= 0&
   iREG_DWORD_LITTLE_ENDIAN 
= 4&
   iREG_DWORD_BIG_ENDIAN 
= 5&
   iREG_LINK 
= 6&
   iREG_MULTI_SZ 
= 7&
   iREG_RESOURCE_LIST 
= 8&
   iREG_FULL_RESOURCE_DEscrīptOR 
= 9&
   iREG_RESOURCE_REQUIREMENTS_LIST 
= 10&
End Enum
'注册表
Private Const ERROR_SUCCESS = 0&
Private Const ERROR_BADDB = 1009&
Private Const ERROR_BADKEY = 1010&
Private Const ERROR_CANTOPEN = 1011&
Private Const ERROR_CANTREAD = 1012&
Private Const ERROR_CANTWRITE = 1013&
Private Const ERROR_OUTOFMEMORY = 14&
Private Const ERROR_INVALID_PARAMETER = 87&
Private Const ERROR_ACCESS_DENIED = 5&
Private Const ERROR_NO_MORE_ITEMS = 259&
Private Const ERROR_MORE_DATA = 234&
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 KEY_CREATE_LINK = &H20&
Private Const SYNCHRONIZE = &H100000
Private Const READ_CONTROL = &H20000
Private Const WRITE_DAC = &H40000
Private Const WRITE_OWNER = &H80000
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const STANDARD_RIGHTS_READ = READ_CONTROL
Private Const STANDARD_RIGHTS_WRITE = READ_CONTROL
Private Const STANDARD_RIGHTS_EXECUTE = READ_CONTROL
Private Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
Private Const KEY_WRITE = STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY
Private Const KEY_EXECUTE = KEY_READ
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As LongByVal lpSubKey As String, phkResult As LongAs Long
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As LongByVal lpSubKey As StringByVal Reserved As LongByVal lpClass As StringByVal dwOptions As LongByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As LongAs Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As LongByVal dwIndex As LongByVal lpValueName As String, lpcbValueName As LongByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As LongAs Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As LongByVal dwIndex As LongByVal lpName As String, lpcbName As LongByVal lpReserved As LongByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As LongByVal lpSubKey As StringByVal ulOptions As LongByVal samDesired As Long, phkResult As LongAs Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As LongAs Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As LongByVal lpValueName As StringAs Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As LongByVal lpValueName As StringByVal Reserved As LongByVal dwType As LongByVal lpData As StringByVal cbData As LongAs Long
Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As LongByVal lpValueName As StringByVal Reserved As LongByVal dwType As Long, lpData As LongByVal cbData As LongAs Long
Private Declare Function RegSetValueExA Lib "advapi32.dll" (ByVal hKey As LongByVal lpValueName As StringByVal Reserved As LongByVal dwType As LongByRef lpData As LongByVal cbData As LongAs Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As LongByVal lpValueName As StringByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As LongAs Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As LongByVal lpSubKey As StringAs Long
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As LongByVal lpFile As StringByVal lpSecurityAttributes As LongAs Long
Private Declare Function RegRestoreKey Lib "advapi32.dll" Alias "RegRestoreKeyA" (ByVal hKey As LongByVal lpFile As StringByVal dwflags As LongAs Long
Private Type FILETIME
   dwLowDateTime 
As Long
   dwHighDateTime 
As Long
End Type
Private Type SECURITY_ATTRIBUTES
   nLength 
As Long
   lpSecurityDescrīptor 
As Long
   bInheritHandle 
As Boolean
End Type
Public Function GetValue(ByVal mainKey As enumRegMainKey, _
                        
ByVal subKey As String, _
                        
ByVal keyV As String, _
                        
ByRef sValue As Variant, _
                        
Optional ByRef rlngErrNum As Long, _
                        
Optional ByRef rstrErrDescr As StringAs Boolean
   
Dim hKey As Long, lType As Long, lBuffer As Long, sBuffer As String, lData As Long
   
On Error GoTo GetValueErr
   GetValue 
= False
   
If RegOpenKeyEx(mainKey, subKey, 0, KEY_READ, hKey) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "获取注册表值时出错"
   
End If
   
If RegQueryValueEx(hKey, keyV, 0, lType, ByVal 0, lBuffer) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "获取注册表值时出错"
   
End If
   
Select Case lType
      
Case iREG_SZ
         lBuffer 
= 255
         sBuffer 
= Space(lBuffer)
         
If RegQueryValueEx(hKey, keyV, 0, lType, ByVal sBuffer, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "获取注册表值时出错"
         
End If
         sValue 
= Left(sBuffer, InStr(sBuffer, Chr(0)) - 1)
      
Case iREG_EXPAND_SZ
         sBuffer 
= Space(lBuffer)
         
If RegQueryValueEx(hKey, keyV, 0, lType, ByVal sBuffer, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "获取注册表值时出错"
         
End If
         sValue 
= Left(sBuffer, InStr(sBuffer, Chr(0)) - 1)
      
Case iREG_DWORD
         
If RegQueryValueEx(hKey, keyV, 0, lType, lData, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "获取注册表值时出错"
         
End If
         sValue 
= lData
      
Case iREG_BINARY
         
If RegQueryValueEx(hKey, keyV, 0, lType, lData, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "获取注册表值时出错"
         
End If
         sValue 
= lData
   
End Select
   
If RegCloseKey(hKey) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "获取注册表值时出错"
   
End If
   GetValue 
= True
   Err.Clear
GetValueErr:
   rlngErrNum 
= Err.Number
   rstrErrDescr 
= Err.Descrīption
End Function
Public Function SetValue(ByVal mainKey As enumRegMainKey, _
                        
ByVal subKey As String, _
                        
ByVal keyV As String, _
                        
ByVal lType As enumRegSzType, _
                        
ByVal sValue As Variant, _
                        
Optional ByRef rlngErrNum As Long, _
                        
Optional ByRef rstrErrDescr As StringAs Boolean
   
Dim S As Long, lBuffer As Long, hKey As Long
   
Dim ss As SECURITY_ATTRIBUTES
   
On Error GoTo SetValueErr
   SetValue 
= False
   ss.nLength 
= Len(ss)
   ss.lpSecurityDescrīptor 
= 0
   ss.bInheritHandle 
= True
   
If RegCreateKeyEx(mainKey, subKey, 0""0, KEY_WRITE, ss, hKey, S) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "设置注册表时出错"
   
End If
   
Select Case lType
      
Case iREG_SZ
         lBuffer 
= LenB(sValue)
         
If RegSetValueEx(hKey, keyV, 0, lType, ByVal sValue, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "设置注册表时出错"
         
End If
      
Case iREG_EXPAND_SZ
         lBuffer 
= LenB(sValue)
         
If RegSetValueEx(hKey, keyV, 0, lType, ByVal sValue, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "设置注册表时出错"
         
End If
      
Case iREG_DWORD
         lBuffer 
= 4
         
If RegSetValueExA(hKey, keyV, 0, lType, sValue, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "设置注册表时出错"
         
End If
      
Case iREG_BINARY
         lBuffer 
= 4
         
If RegSetValueExA(hKey, keyV, 0, lType, sValue, lBuffer) <> ERROR_SUCCESS Then
            Err.Raise vbObjectError 
+ 1, , "设置注册表时出错"
         
End If
      
Case Else
         Err.Raise vbObjectError 
+ 1, , "不支持该参数类型"
   
End Select
   
If RegCloseKey(hKey) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "设置注册表时出错"
   
End If
   SetValue 
= True
   Err.Clear
SetValueErr:
   rlngErrNum 
= Err.Number
   rstrErrDescr 
= Err.Descrīption
End Function
Public Function DeleteValue(ByVal mainKey As enumRegMainKey, _
                           
ByVal subKey As String, _
                           
ByVal keyV As String, _
                           
Optional ByRef rlngErrNum As Long, _
                           
Optional ByRef rstrErrDescr As StringAs Boolean
   
Dim hKey As Long
   
On Error GoTo DeleteValueErr
   DeleteValue 
= False
   
If RegOpenKeyEx(mainKey, subKey, 0, KEY_WRITE, hKey) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "删除注册表值时出错"
   
End If
   
If RegDeleteValue(hKey, keyV) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "删除注册表值时出错"
   
End If
   
If RegCloseKey(hKey) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "删除注册表值时出错"
   
End If
   DeleteValue 
= True
   Err.Clear
DeleteValueErr:
   rlngErrNum 
= Err.Number
   rstrErrDescr 
= Err.Descrīption
End Function
Public Function DeleteKey(ByVal mainKey As enumRegMainKey, _
                           
ByVal subKey As String, _
                           
ByVal keyV As String, _
                           
Optional ByRef rlngErrNum As Long, _
                           
Optional ByRef rstrErrDescr As StringAs Boolean
   
Dim hKey As Long
   
On Error GoTo DeleteKeyErr
   DeleteKey 
= False
   
If RegOpenKeyEx(mainKey, subKey, 0, KEY_WRITE, hKey) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "删除注册表值时出错"
   
End If
   
If RegDeleteKey(hKey, keyV) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "删除注册表值时出错"
   
End If
   
If RegCloseKey(hKey) <> ERROR_SUCCESS Then
      Err.Raise vbObjectError 
+ 1, , "删除注册表值时出错"
   
End If
   DeleteKey 
= True
   Err.Clear
DeleteKeyErr:
   rlngErrNum 
= Err.Number
   rstrErrDescr 
= Err.Descrīption
End Function
posted on 2008-03-09 15:23  ExcelFans  阅读(2999)  评论(0编辑  收藏  举报