请问怎样用VB访问注册表?

解决方案 »

  1.   

    窗体中:
    Option ExplicitPrivate Sub Form_Load()Dim hkey            As Long
    Dim lptype          As Long
    Dim buffer          As Stringbuffer = Space(255)If RegOpenKeyEx(HKEY_LOCAL_MACHINE, "software\microsoft\shared tools\msinfo", 0, KEY_READ, hkey) = ERROR_SUCCESS Then
        
        If RegQueryValueEx(hkey, "path", 0, lptype, ByVal buffer, Len(buffer)) = ERROR_SUCCESS Then
        
            If lptype = REG_SZ Then
            
                If Dir$(buffer) <> "" Then
                    
                    Shell buffer, vbNormalFocus
                
                End If
            
            End If
        
        End IfEnd IfEnd Sub模快中
    Option ExplicitPublic 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 LongPublic 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 LongPublic Const REG_SZ = 1Public Const KEY_NOTIFY = &H10Public Const HKEY_LOCAL_MACHINE = &H80000002Public Const SYNCHRONIZE = &H100000Public Const KEY_ENUMERATE_SUB_KEYS = &H8Public Const KEY_QUERY_VALUE = &H1Public Const READ_CONTROL = &H20000Public Const STANDARD_RIGHTS_READ = (READ_CONTROL)Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))Public Const ERROR_SUCCESS = 0&
      

  2.   

    你希望你的程序能访问 Windows 注册表吗?当然,能访问庞大的 Windows 注册表是每个程序设计者都希望的事情,那么我就告诉你如何通过API函数访问 Windows 注册表吧。请先看看下面的 Visual Basic 程序:  '根键常数
    Const HKEY_CLASSES_ROOT = -2147483648#
    Const HKEY_CURRENT_USER = -2147483647#
    Const HKEY_LOCAL_MACHINE = -2147483646#
    Const HKEY_USERS = -2147483645#'键值类型
    Const REG_SZ = 1&           '字符串值
    Const REG_BINARY = 3&       '二进制值
    Const REG_DWORD = 4&        'DWORD 值'声明有关API函数
    Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
    ( _
        ByVal hKey As Long, _
        ByVal lpSubKey As String, _
        ByRef phkResult As Long _
    ) As Long       '建立一个新的主键Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
    ( _
        ByVal hKey As Long, _
        ByVal lpSubKey As String, _
        ByRef phkResult 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 RegCloseKey Lib "advapi32.dll" _
    ( _
        ByVal hKey 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 Any, _
        ByVal cbData As Long _
    ) As Long       '创建或改变一个键值,有时 lpData 应由缺省的 ByRef 型改为 ByVal 型Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
    ( _
        ByVal hKey As Long, _
        ByVal lpValueName As String, _
        ByVal lpReserved As Long, _
        ByRef lpType As Long, _
        ByVal lpData As Any, _
        ByRef lpcbData As Long _
    ) As Long       '查询一个键值,有时 lpData 应由缺省的 ByRef 型改为 ByVal 型Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
    ( _
        ByVal hKey As Long, _
        ByVal lpValueName As String _
    ) As Long       '删除一个键值'主过程
    Sub Main()
        Dim nKeyHandle As Long, nValueType As Long, nLength As Long
        Dim sValue As String
        sValue = "I am a winner!"
        Call RegCreateKey(HKEY_CURRENT_USER, "New Registry Key", nKeyHandle)
        Call RegSetValueEx(nKeyHandle, "My Value", 0, REG_SZ, sValue, 255)
        sValue = Space(255)
        nLength = 255
        Call RegQueryValueEx(nKeyHandle, "My Value", 0, nValueType, sValue, nLength)
        MsgBox sValue
        Call RegDeleteValue(nKeyHandle, "My Value")
        Call RegDeleteKey(HKEY_CURRENT_USER, "New Registry Key")
        Call RegCloseKey(nKeyHandle)
    End Sub
     
      来看看程序运行的结果:
      在注册表的 HKEY_CURRENT_USER 根键中多了一个 New Registry Key 主键。其中除有一个空的“(默认)”值外,还有一个值为“I am a winner!”的“My Value”值。  下面我们来分析一下这个程序:
      首先是定义常量。前面四个常量是各根键的句柄,这些句柄都是固定的;后三个是键值类型,在注册表编辑器中右键单击主键弹出的“新建”菜单项中,可以看到这三个键值类型。
      第二步是声明API函数。这一步可以通过“API 文本浏览器”来完成:用“API 文本浏览器”加载文件“Win32Api.txt”,查找出上例中的 API 函数并添加到“选定项”一栏中,点取“复制”按钮,再回到 VB 程序编辑环境,将剪贴板中的内容粘贴到VB程序编辑器中,这样就完成了 API 函数的声明过程。值得注意的是,“RegSetValueEx”和“ RegQueryValueEx”两个函数中的“lpData”被定义为“Any”类型的,却没有定义传递方式,于是它被默认为“ByRef”传递方式。经笔者测试,有时这样不能正确的设置或查询键值,但将其传递方式改为“ByVal”后,便 OK 了。
      第三步便是在访问注册表了。“RegOpenKey”的用法与“RegCreateKey”的用法是类似的,前者用于打开一个已存在的主键,而后者除了能用于打开一个已存在的主键外,如果该主键不存在,还能创建这个主键。打开或创建主键成功后将返回一个句柄给参数“phkResult”,这个句柄将在对键值的操作中用到,它就是“RegSetValueEx”、“RegQueryValueEx”和“RegDeleteValue”中的“nKeyHandle”参数。
      还有一点需要说明,每个主键中都有一个键值名显示为“(默认)”,但其键值名并不就是“(默认)”,而是一个空字符串。  现在,你知道怎样通过API函数访问Windows注册表了吗?