明晨网络

电话: 136-6532-7492 QQ: 给我发送消息 8507-0741

VB下的注册表操作类模块

admin,2009-06-12 18:24, 文章标签: VB 类模块 注册表

    一个VB下的注册表操作类模块,非常好用。明晨网络收集于2007年,现在贴出来吧
 

  1. '========================================  
  2.    '模块名称:Reg  
  3.    '模块说明:本模块封装了操作注册表的方法  
  4.    '最后更新: 明晨网络 www.MingchenNet.com 2009-05-31 21:57  
  5.    '========================================  
  6.      
  7. Option Explicit  
  8.      
  9. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _  
  10.     (dest As Any, source As Any, ByVal numBytes As Long)  
  11.      
  12. Private Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsA" _  
  13.     (ByVal lpSrc As StringByVal lpDst As StringByVal nSize As LongAs Long 
  14.      
  15.    
  16. Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _  
  17.     (ByVal hKey As LongByVal lpSubKey As StringByVal ulOptions As Long, _  
  18.     ByVal samDesired As Long, phkResult As LongAs Long 
  19.      
  20. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As LongAs Long 
  21.      
  22. Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias _  
  23.     "RegQueryValueExA" (ByVal hKey As LongByVal lpValueName As String, _  
  24.     ByVal lpReserved As Long, lpType As Long, lpdata As Any, _  
  25.     lpcbData As LongAs Long 
  26.      
  27. Private Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" _  
  28.     (ByVal hKey As LongByVal lpValueName As String, _  
  29.     ByVal Reserved As LongByVal dwType As Long, _  
  30.     ByVal lpbData As Any, ByVal cbData As LongAs Long 
  31.      
  32. Private Declare Function RegCreateKeyEx Lib "advapi32" Alias "RegCreateKeyExA" _  
  33.     (ByVal hKey As LongByVal lpSubKey As StringByVal Reserved As Long, _  
  34.     ByVal lpClass As StringByVal dwOptions As Long, _  
  35.     ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _  
  36.     phkResult As Long, lpdwDisposition As LongAs Long 
  37.      
  38. Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" _  
  39.     (ByVal hKey As LongByVal dwIndex As LongByVal lpName As String, _  
  40.     lpcbName As LongByVal lpReserved As LongByVal lpClass As String, _  
  41.     lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long 
  42.      
  43. Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" _  
  44.     (ByVal hKey As LongByVal dwIndex As Long, _  
  45.     ByVal lpValueName As String, lpcbValueName As LongByVal lpReserved As Long, _  
  46.     lpType As LongByVal lpdata As String, lpcbData As LongAs Long 
  47.      
  48. Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _  
  49.     (ByVal hKey As LongByVal lpSubKey As StringAs Long 
  50.      
  51. Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _  
  52.     (ByVal hKey As LongByVal lpValueName As StringAs Long 
  53.      
  54. Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" _  
  55.     (ByVal hKey As LongByVal ipValueName As String, _  
  56.     ByVal Reserved As LongByVal dwType As Long, _  
  57.     ByVal lpValue As StringByVal cbData As LongAs Long 
  58.      
  59. Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" _  
  60.     (ByVal hKey As LongByVal lpValueName As String, _  
  61.     ByVal Reserved As LongByVal dwType As Long, _  
  62.     lpValue As LongByVal cbData As LongAs Long 
  63.      
  64. Private Declare Function RegSetValueExByte Lib "advapi32.dll" Alias "RegSetValueExA" _  
  65.     (ByVal hKey As LongByVal lpValueName As String, _  
  66.     ByVal Reserved As LongByVal dwType As Long, _  
  67.     lpValue As ByteByVal cbData As LongAs Long 
  68.      
  69. Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" _  
  70.     (ByVal hKey As LongByVal lpClass As String, lpcbClass As Long, _  
  71.     ByVal lpReserved As Long, lpcSubKeys As Long, _  
  72.     lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, lpcValues As Long, _  
  73.     lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, _  
  74.     lpcbSecurityDescriptor As Long, lpftLastWriteTime As FILETIME) As Long 
  75.      
  76. Private Declare Function RegEnumValueInt Lib "advapi32.dll" Alias "RegEnumValueA" _  
  77.     (ByVal hKey As LongByVal dwIndex As LongByVal lpValueName As String, _  
  78.     lpcbValueName As LongByVal lpReserved As Long, lpType As Long, _  
  79.     lpdata As Byte, lpcbData As LongAs Long 
  80.      
  81. Private Declare Function RegEnumValueStr Lib "advapi32.dll" Alias "RegEnumValueA" _  
  82.     (ByVal hKey As LongByVal dwIndex As LongByVal lpValueName As String, _  
  83.     lpcbValueName As LongByVal lpReserved As Long, lpType As Long, _  
  84.     lpdata As Byte, lpcbData As LongAs Long 
  85.      
  86. Private Declare Function RegEnumValueByte Lib "advapi32.dll" Alias "RegEnumValueA" _  
  87.     (ByVal hKey As LongByVal dwIndex As LongByVal lpValueName As String, _  
  88.     lpcbValueName As LongByVal lpReserved As Long, lpType As Long, _  
  89.     lpdata As Byte, lpcbData As LongAs Long 
  90.      
  91.     '//注册表结构  
  92. Private Type SECURITY_ATTRIBUTES  
  93.     nLength As Long 
  94.     lpSecurityDescriptor As Long 
  95.     bInheritHandle As Boolean 
  96. End Type  
  97.      
  98. Private Type FILETIME  
  99.     dwLowDateTime As Long 
  100.     dwHighDateTime As Long 
  101. End Type  
  102.      
  103.     '//注册表访问权  
  104. Const KEY_QUERY_VALUE = &H1  
  105. Const KEY_SET_VALUE = &H2  
  106. Const KEY_Create_SUB_KEY = &H4  
  107. Const KEY_ENUMERATE_SUB_KEYS = &H8  
  108. Const KEY_NOTIFY = &H10  
  109. Const KEY_Create_LINK = &H20  
  110. Const KEY_ALL_ACCESS = &H3F  
  111.      
  112.     '//打开/建立选项  
  113. Const REG_OPTION_NON_VOLATILE = 0&  
  114. Const REG_OPTION_VOLATILE = &H1  
  115.      
  116.     '//Key 创建/打开  
  117. Const REG_CreateD_NEW_KEY = &H1  
  118. Const REG_OPENED_EXISTING_KEY = &H2  
  119.      
  120.     '//预定义存取类型  
  121. Const STANDARD_RIGHTS_ALL = &H1F0000  
  122. Const SPECIFIC_RIGHTS_ALL = &HFFFF  
  123.      
  124.     '//严格代码定义  
  125. Const ERROR_SUCCESS = 0&  
  126. Const ERROR_ACCESS_DENIED = 5  
  127. Const ERROR_NO_MORE_ITEMS = 259  
  128. Const ERROR_MORE_DATA = 234 '//   错误  
  129.      
  130.     '//注册表值类型列举  
  131. Private Enum RegDataTypeEnum  
  132.     '    REG_NONE = (0)                          '// No value type  
  133.    REG_SZ = (1)                            '// Unicode nul terminated string  
  134.    REG_EXPAND_SZ = (2)                     '// Unicode nul terminated string w/enviornment var  
  135.    REG_BINARY = (3)                        '// Free form binary  
  136.    REG_DWORD = (4)                         '// 32-bit number  
  137.    REG_DWORD_LITTLE_ENDIAN = (4)           '// 32-bit number (same as REG_DWORD)  
  138.    REG_DWORD_BIG_ENDIAN = (5)              '// 32-bit number  
  139.    '    REG_LINK = (6)                          '// Symbolic Link (unicode)  
  140.    REG_MULTI_SZ = (7)                      '// Multiple, null-delimited, double-null-terminated Unicode strings  
  141.    '    REG_RESOURCE_LIST = (8)                 '// Resource list in the resource map  
  142.    '    REG_FULL_RESOURCE_DESCRIPTOR = (9)      '// Resource list in the hardware description  
  143.    '    REG_RESOURCE_REQUIREMENTS_LIST = (10)  
  144. End Enum 
  145.      
  146.     '//注册表基本键值列表  
  147. Public Enum RootKeyEnum  
  148.     HKEY_CLASSES_ROOT = &H80000000  
  149.     HKEY_CURRENT_USER = &H80000001  
  150.     HKEY_LOCAL_MACHINE = &H80000002  
  151.     HKEY_USERS = &H80000003  
  152.     HKEY_PERFORMANCE_DATA_WIN2K_ONLY = &H80000004 '//仅Win2k  
  153.    HKEY_CURRENT_CONFIG = &H80000005  
  154.     HKEY_DYN_DATA = &H80000006  
  155. End Enum 
  156.      
  157.     '// for specifying the type of data to save  
  158. Public Enum RegValueTypes  
  159.     eInteger = vbInteger  
  160.     eLong = vbLong  
  161.     eString = vbString  
  162.     eByteArray = vbArray + vbByte  
  163. End Enum 
  164.      
  165.     '//保存时指定类型  
  166. Public Enum RegFlags  
  167.     IsExpandableString = 1  
  168.     IsMultiString = 2  
  169.     'IsBigEndian = 3 '// 无指针同样不要设置大Endian值  
  170. End Enum 
  171.      
  172. Private Const ERR_NONE = 0  
  173.    
  174.    
  175. Function SetRegistryValue(ByVal hKey As RootKeyEnum, ByVal KeyName As String, _  
  176.     ByVal ValueName As StringByVal Value As Variant, valueType As RegValueTypes, _  
  177.     Optional Flag As RegFlags = 0) As Boolean 
  178.      
  179.     Dim handle As Long 
  180.     Dim lngValue As Long 
  181.     Dim strValue As String 
  182.     Dim binValue() As Byte 
  183.     Dim Length As Long 
  184.     Dim retVal As Long 
  185.      
  186.     Dim SecAttr As SECURITY_ATTRIBUTES '//键的安全设置  
  187.    '//设置新键值的名称和默认安全设置  
  188.    SecAttr.nLength = Len(SecAttr) '//结构大小  
  189.    SecAttr.lpSecurityDescriptor = 0 '//默认安全权限  
  190.    SecAttr.bInheritHandle = True '//设置的默认值  
  191.      
  192.     '// 打开或创建键  
  193.    'If RegOpenKeyEx(hKey, KeyName, 0, KEY_ALL_ACCESS, handle) Then Exit Function  
  194.    retVal = RegCreateKeyEx(hKey, KeyName, 0, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, SecAttr, handle, retVal)  
  195.     If retVal Then Exit Function 
  196.      
  197.     '//3种数据类型  
  198.    Select Case VarType(Value)  
  199.     Case vbByte, vbInteger, vbLong '// 若是字节, Integer值或Long值...  
  200.        lngValue = Value  
  201.         retVal = RegSetValueExLong(handle, ValueName, 0, REG_DWORD, lngValue, Len(lngValue))  
  202.          
  203.     Case vbString '// 字符串, 扩展环境字符串或多段字符串...  
  204.        strValue = Value  
  205.         Select Case Flag  
  206.         Case IsExpandableString  
  207.             retVal = RegSetValueEx(handle, ValueName, 0, REG_EXPAND_SZ, ByVal strValue, LenB(StrConv(strValue, vbFromUnicode)))  
  208.         Case IsMultiString  
  209.             retVal = RegSetValueEx(handle, ValueName, 0, REG_MULTI_SZ, ByVal strValue, LenB(StrConv(strValue, vbFromUnicode)))  
  210.         Case Else '// 正常 REG_SZ 字符串  
  211.            retVal = RegSetValueEx(handle, ValueName, 0, REG_SZ, ByVal strValue, LenB(StrConv(strValue, vbFromUnicode)))  
  212.         End Select 
  213.          
  214.     Case vbArray + vbByte '// 如果是字节数组...  
  215.        binValue = Value  
  216.         Length = UBound(binValue) - LBound(binValue) + 1  
  217.         retVal = RegSetValueExByte(handle, ValueName, 0, REG_BINARY, binValue(0), Length)  
  218.          
  219.     Case Else '// 如果其它类型  
  220.        RegCloseKey handle  
  221.         'Err.Raise 1001, , "不支持的值类型"  
  222.          
  223.     End Select 
  224.      
  225.     '// 返回关闭结果  
  226.    RegCloseKey handle  
  227.      
  228.     '// 返回写入成功结果  
  229.    SetRegistryValue = (retVal = 0)  
  230.      
  231. End Function 
  232.    
  233.    
  234. Function GetRegistryValue(ByVal hKey As RootKeyEnum, ByVal KeyName As String, _  
  235.     ByVal ValueName As StringOptional DefaultValue As VariantAs Variant 
  236.      
  237.     Dim handle As Long 
  238.     Dim resLong As Long 
  239.     Dim resString As String 
  240.     Dim resBinary() As Byte 
  241.     Dim Length As Long 
  242.     Dim retVal As Long 
  243.     Dim valueType As Long 
  244.      
  245.     Const KEY_READ = &H20019  
  246.      
  247.     '// 默认结果  
  248.    GetRegistryValue = IIf(IsMissing(DefaultValue), Empty, DefaultValue)  
  249.      
  250.     '// 打开键, 不存在则退出  
  251.    If RegOpenKeyEx(hKey, KeyName, 0, KEY_READ, handle) Then Exit Function 
  252.      
  253.     '// 准备 1K   resBinary 用于接收  
  254.    Length = 1024  
  255.     ReDim resBinary(0 To Length - 1) As Byte 
  256.      
  257.     '// 读注册表值  
  258.    retVal = RegQueryValueEx(handle, ValueName, 0, valueType, resBinary(0), Length)  
  259.      
  260.     '// 若resBinary 太小则重读  
  261.    If retVal = ERROR_MORE_DATA Then 
  262.         '// resBinary放大,且重新读取  
  263.        ReDim resBinary(0 To Length - 1) As Byte 
  264.         retVal = RegQueryValueEx(handle, ValueName, 0, valueType, resBinary(0), _  
  265.         Length)  
  266.     End If 
  267.      
  268.     '// 返回相应值类型  
  269.    Select Case valueType  
  270.     Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN  
  271.         '// REG_DWORD 和 REG_DWORD_LITTLE_ENDIAN 相同  
  272.        CopyMemory resLong, resBinary(0), 4  
  273.         GetRegistryValue = resLong  
  274.          
  275.     Case REG_DWORD_BIG_ENDIAN  
  276.         '// Big Endian's 用在非-Windows环境, 如Unix系统, 本地计算机远程访问  
  277.        CopyMemory resLong, resBinary(0), 4  
  278.         GetRegistryValue = SwapEndian(resLong)  
  279.          
  280.     Case REG_SZ, REG_EXPAND_SZ  
  281.         resString = Space$(Length - 1)  
  282.         CopyMemory ByVal resString, resBinary(0), Length - 1  
  283.         If valueType = REG_EXPAND_SZ Then 
  284.             '// 查询对应的环境变量  
  285.            GetRegistryValue = ExpandEnvStr(resString)  
  286.         Else 
  287.             GetRegistryValue = resString  
  288.         End If 
  289.          
  290.     Case REG_MULTI_SZ  
  291.         '// 复制时需指定2个空格符  
  292.        resString = Space$(Length - 2)  
  293.         CopyMemory ByVal resString, resBinary(0), Length - 2  
  294.         GetRegistryValue = resString  
  295.          
  296.     Case Else ' 包含 REG_BINARY  
  297.        '// resBinary 调整  
  298.        If Length <> UBound(resBinary) + 1 Then 
  299.             ReDim Preserve resBinary(0 To Length - 1) As Byte 
  300.         End If 
  301.         GetRegistryValue = resBinary()  
  302.          
  303.     End Select 
  304.      
  305.     '// 关闭  
  306.    RegCloseKey handle  
  307.      
  308. End Function 
  309.    
  310.    
  311. Public Function DeleteRegistryValueOrKey(ByVal hKey As RootKeyEnum, RegKeyName As String, _  
  312.     ValueName As StringAs Boolean 
  313.     '//删除注册表值和键,如果成功返回True  
  314.      
  315.     Dim lRetval As Long       '//打开和输出注册表键的返回值  
  316.    Dim lRegHWND As Long      '//打开注册表键的句柄  
  317.    Dim sREGSZData As String '//把获取值放入缓冲区  
  318.    Dim lSLength As Long      '//缓冲区大小.   改变缓冲区大小要在调用之后  
  319.      
  320.     '//打开键  
  321.    lRetval = RegOpenKeyEx(hKey, RegKeyName, 0, KEY_ALL_ACCESS, lRegHWND)  
  322.      
  323.     '//成功打开  
  324.    If lRetval = ERR_NONE Then 
  325.         '//删除指定值  
  326.        lRetval = RegDeleteValue(lRegHWND, ValueName)   '//如果已存在则先删除  
  327.          
  328.         '//如出现错误则删除值并返回False  
  329.        If lRetval <> ERR_NONE Then Exit Function 
  330.          
  331.         '//注意: 如果成功打开仅关闭注册表键  
  332.        lRetval = RegCloseKey(lRegHWND)  
  333.          
  334.         '//如成功关闭则返回 True 或者其它错误  
  335.        If lRetval = ERR_NONE Then DeleteRegistryValueOrKey = True 
  336.          
  337.     End If 
  338.      
  339. End Function 
  340.    
  341.    
  342. Private Function ExpandEnvStr(sData As StringAs String 
  343.     '// 查询环境变量和返回定义值  
  344.    '// 如: %PATH% 则返回 "c:;c:windows;"  
  345.      
  346.     Dim C As Long, s As String 
  347.      
  348.     s = "" '// 不支持Windows 95  
  349.      
  350.     '// get the length  
  351.    C = ExpandEnvironmentStrings(sData, s, C)  
  352.      
  353.     '// 展开字符串  
  354.    s = String$(C - 1, 0)  
  355.     C = ExpandEnvironmentStrings(sData, s, C)  
  356.      
  357.     '// 返回环境变量  
  358.    ExpandEnvStr = s  
  359.      
  360. End Function 
  361.    
  362.    
  363. Private Function SwapEndian(ByVal dw As LongAs Long 
  364.     '// 转换大DWord 到小 DWord  
  365.      
  366.     CopyMemory ByVal VarPtr(SwapEndian) + 3, dw, 1  
  367.     CopyMemory ByVal VarPtr(SwapEndian) + 2, ByVal VarPtr(dw) + 1, 1  
  368.     CopyMemory ByVal VarPtr(SwapEndian) + 1, ByVal VarPtr(dw) + 2, 1  
  369.     CopyMemory SwapEndian, ByVal VarPtr(dw) + 3, 1  
  370.      
  371. End Function 

文章源自:明晨网络,admin,《VB下的注册表操作类模块》,http://www.mingchennet.com/tec/code/vb/22.htm