如何使用注册表 API 保存和检索设置

文章翻译 文章翻译
文章编号: 145679 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

虽然 Visual Basic 包括 SaveSetting 和 GetSetting 函数以保存并从注册表检索信息,这些函数只对注册表 Visual Basic 和 VBA 程序设置的注册表根项的特定部分进行操作。

本文概述了使用的 32 位 Windows API 函数可用于设置和检索从任何位置的值在注册表中。主题和本文中的函数引用可以被通常 16 位程序注册表。

32 位 API 函数还包括安全,支持,尽管超出了本文的范围是安全的概述。

注: 该 SaveSetting 和 GetSetting 函数不是 VBA 函数库的一部分。但是,将下面的示例代码仍适用于实现 VBA 的 32 位应用程序。

更多信息

一般的注册表信息

注册表是由应用程序和 Windows 用来存储配置数据。它是对较大的数字遍布在 Windows 3.x 计算机上并由也使用很大程度 OLE 的 INI 文件的替换。

注册表被组织使用的键和值与一个树的层次结构序列。每个键以在六个的预定义的根键之一开头可以有子项和与它相关联的值。键是组织和命名的单元,并且会出现在 Windows 注册表编辑器,为文件的文件夹中。值数据条目,并显示为注册表编辑器窗口的右窗格中的文本项。密钥不需要任何相关联的值,但可能有很多。每个值都有一个关联的数据类型。这两种最常使用的注册表数据类型是 REG_SZ、 空终止的字符串 ; 和 REG_DWORD,一个 32 位的数字。

用于写入或读取从注册表中的某个位置的基本过程是相同的。若要引用的任何给定的项或值,您必须具有键的句柄。一旦获得的此句柄值和 $ 此句柄引用的项的子项可读取、 设置,或列出 (枚举)。

给出了注册表以获取对该注册表项,句柄中的某个位置必须以一个六个预定义项 (HKEY_CLASSES_ROOT、 注册表、 HKEY_LOCAL_MACHINE、 项、 HKEY_CURRENT_CONFIG 和 HKEY_DYN_DATA) 开始,并遍历注册表树,直到达到所需的密钥。用户程序通常从读取和写入注册表和 HKEY_LOCAL_MACHINE。如果正在遍历键已存在,您可以使用一系列 RegOpenKey 或 RegOpenKeyEx 函数的调用。如果需要创建密钥,RegCreateKey 和 RegCreateKeyEx 函数执行此作业。

与所需的密钥对的该句柄可以调用该函数用于在列表、 设置,和检索信息。在所有的情况中带有 Ex 后缀函数 32 位平台上只可以正常工作。在 16 位和 32 位版本的 Windows,而不使用后缀的功能可能起作用。请记住,并非所有的注册表函数缺少 Ex 后缀是为 16 位兼容性而提供的函数。已展开的 16 位函数功能时,只有已添加 Ex 后缀。到 32 位平台是完全新的和特定的函数不具备 Ex 扩展。

RegSetValue 和 RegSetValueEx 函数允许值的设置来进行修改时 RegQueryValue 和 RegQueryValueEx 检索值的当前设置。无-Ex 限制,16 位版本的这些 api 在非常明显此处。使用 16 位 RegSetValue 函数时没有任何方法可以命名为一个值,并因此,RegSetValue 不能用于将多个值与每个键相关联。此外,RegSetValue 编写的所有值都具有一个数据类型 REG_SZ。这些限制是固有的 16 位注册表。RegSetValueEx 允许创建的任何可用数据类型带多个数字的值。

如何写到特定的注册表位置

确定您将需要为您的项目使用什么函数之后, 相关的复制到基本模块声明从本文结尾处的代码。这两个 Visual Basic 过程包括 (SetValueEx 和 QueryValueEx) RegSetValueEx 和 RegQueryValueEx API 函数的包装,极大地简化其使用。生成下面说明这些 vba 函数的使用 ; 但是,您可以自由地进行直接给 API 的调用,如果您希望。

创建/修改项和值:

与声明和可用的过程中,您可以创建和打开项,和添加、 修改,和读取的值。三个以下各节介绍了如何创建一项、 设置或修改一个值和查询值。

正在创建新的密钥:

正在创建新的密钥非常简单,只需使用下面的过程。 CreateNewKey 采用创建,密钥和常量表示要创建此注册表项,在预定义的键的名称。RegCreateKeyEx 调用不利用允许的安全机制,但可能对其进行修改,以执行此操作。注册表安全性的讨论了超出了本文的范围。
   Private Sub CreateNewKey (sNewKeyName As String, lPredefinedKey As Long)
       Dim hNewKey As Long         'handle to the new key
       Dim lRetVal As Long         'result of the RegCreateKeyEx function

       lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, _
                 vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, _
                 0&, hNewKey, lRetVal)
       RegCloseKey (hNewKey)
   End Sub
				

使用此过程调用的一个:
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

将创建一个名为立即下 HKEY_LOCAL_MACHINE TestKey 的密钥。

调用 CreateNewKey 像下面这样:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

将创建三个嵌套的键,以开始立即下 HKEY_CURRENT_USER,SubKey1 TestKey,从属于 TestKey 并 SubKey3 SubKey2 下。

设置/修改值:

可以使用下面的简短过程来完成创建和设置一个值,指定的项。SetKeyValue 采用值将与该的值在的值和类型的值 (在 SetValueEx 函数只支持如有必要,可以修改 REG_SZ 和 REG_DWORD,但这) 设置的名称相关联的键。指定一个现有 sValueName 的新值将修改该值的当前设置。
   Private Sub SetKeyValue (sKeyName As String, sValueName As String, _
   vValueSetting As Variant, lValueType As Long)
       Dim lRetVal As Long         'result of the SetValueEx function
       Dim hKey As Long         'handle of open key

       'open the specified key
       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
                                 KEY_SET_VALUE, hKey)
       lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
       RegCloseKey (hKey)
   End Sub
				

调用:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

将创建 REG_SZ 称为"StringValue"类型的值将设置为"hello。此值将是与主键 SubKey1 的"TestKey。

在这种情况下"TestKey"是一个 HKEY_CURRENT_USER 的子项,但这可以通过更改 RegOpenKeyEx 调用进行修改。如果"TestKey\SubKey1"不存在,此调用将失败。若要不必此问题使用 RegCreateKeyEx 调用而不是 RegOpenKeyEx 的调用。如果它已经存在,RegCreateKeyEx 将打开指定的项。

查询值:

下一个过程可用于确定一个现有值的设置。QueryValue 采用键的名称和与该键关联的值的名称,并显示一个消息框,其中具有相应的值。它使用 QueryValueEx 包装,下面定义的函数仅支持 REG_SZ 和 REG_DWORD 类型的调用。
   Private Sub QueryValue (sKeyName As String, sValueName As String)
       Dim lRetVal As Long         'result of the API functions
       Dim hKey As Long         'handle of opened key
       Dim vValue As Variant      'setting of queried value

       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
   KEY_QUERY_VALUE, hKey)
       lRetVal = QueryValueEx(hKey, sValueName, vValue)
       MsgBox vValue
       RegCloseKey (hKey)
   End Sub
				

使用此过程的调用:
   QueryValue "TestKey\SubKey1", "StringValue"
				

将与"StringValue"值的当前设置显示一个消息框,并假定"StringValue"位于"TestKey\SubKey1"键。

如果不存在值您查询 QueryValue 将返回 2-ERROR_BADKEY 的错误代码。

其他注意事项:

以上示例中以独占方式使用注册表函数的扩展的 32 位版本。这些功能允许多个要与每个键相关联的值。前面已讨论 16 位 RegSetValue 和 RegQueryValue 将作用于与当前的键 (这是始终的类型 REG_SZ) 相关联的单个值。这些函数出现在 32 位注册表编辑器中使用 < NO NAME > 的名称。若要设置、 修改,或查询此特殊的关联的值,一个必须使用 16 位注册表函数。 读取和写入注册表中一个 16 位环境中是比在 32 位环境中非常简单。后面相同的基本过程是: 打开项和获得句柄,然后在调用与该的句柄,但要成为可为多个相关联的值或不同的值数据类型没有考虑需要您修改的函数。16-位应用程序可以创建和修改键和值与 RegCreateKey、 RegOpenKey、 RegQueryValue、 RegSetValue 和 RegCloseKey 函数的声明。

在某些种情况下没有需要与密钥关联的任何值。 应用程序可能只需要知道如果某些注册表项或值存在,并不关心该主键的值的性质。在此类的一个情况下 RegEnumKey、 RegEnumKeyEx 和 RegEnumValue 函数可用于确定是否存在某些注册表项或值。有关这些功能的详细信息,请参阅 API 文本查看器和/或 Windows API 的引用。

API 函数和常数声明

   Option Explicit

   Public Const REG_SZ As Long = 1
   Public Const REG_DWORD As Long = 4

   Public Const HKEY_CLASSES_ROOT = &H80000000
   Public Const HKEY_CURRENT_USER = &H80000001
   Public Const HKEY_LOCAL_MACHINE = &H80000002
   Public Const HKEY_USERS = &H80000003

   Public Const ERROR_NONE = 0
   Public Const ERROR_BADDB = 1
   Public Const ERROR_BADKEY = 2
   Public Const ERROR_CANTOPEN = 3
   Public Const ERROR_CANTREAD = 4
   Public Const ERROR_CANTWRITE = 5
   Public Const ERROR_OUTOFMEMORY = 6
   Public Const ERROR_ARENA_TRASHED = 7
   Public Const ERROR_ACCESS_DENIED = 8
   Public Const ERROR_INVALID_PARAMETERS = 87
   Public Const ERROR_NO_MORE_ITEMS = 259

   Public Const KEY_QUERY_VALUE = &H1
   Public Const KEY_SET_VALUE = &H2
   Public Const KEY_ALL_ACCESS = &H3F

   Public Const REG_OPTION_NON_VOLATILE = 0

   Declare Function RegCloseKey Lib "advapi32.dll" _
   (ByVal hKey As Long) As Long
   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, ByVal lpSecurityAttributes _
   As Long, phkResult As Long, lpdwDisposition As Long) As Long
   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
   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As String, lpcbData As Long) As Long
   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, lpData As _
   Long, lpcbData As Long) As Long
   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As Long, lpcbData As Long) As Long
   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
   String, ByVal cbData As Long) As Long
   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
   ByVal cbData As Long) As Long
				

SetValueEx 和 QueryValueEx 包装函数:
   Public Function SetValueEx(ByVal hKey As Long, sValueName As String, _
   lType As Long, vValue As Variant) As Long
       Dim lValue As Long
       Dim sValue As String
       Select Case lType
           Case REG_SZ
               sValue = vValue & Chr$(0)
               SetValueEx = RegSetValueExString(hKey, sValueName, 0&, _
                                              lType, sValue, Len(sValue))
           Case REG_DWORD
               lValue = vValue
               SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, _
   lType, lValue, 4)
           End Select
   End Function

   Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
   String, vValue As Variant) As Long
       Dim cch As Long
       Dim lrc As Long
       Dim lType As Long
       Dim lValue As Long
       Dim sValue As String

       On Error GoTo QueryValueExError

       ' Determine the size and type of data to be read
       lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
       If lrc <> ERROR_NONE Then Error 5

       Select Case lType
           ' For strings
           Case REG_SZ:
               sValue = String(cch, 0)

   lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
   sValue, cch)
               If lrc = ERROR_NONE Then
                   vValue = Left$(sValue, cch-1)
               Else
                   vValue = Empty
               End If
           ' For DWORDS
           Case REG_DWORD:
   lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
   lValue, cch)
               If lrc = ERROR_NONE Then vValue = lValue
           Case Else
               'all other data types not supported
               lrc = -1
       End Select

   QueryValueExExit:
       QueryValueEx = lrc
       Exit Function

   QueryValueExError:
       Resume QueryValueExExit
   End Function
				

参考

编程 Windows 95 用户界面,第 10 章中的"使用注册表"

为函数引用: 任何 Win16 或 Win32 API 的指南。

属性

文章编号: 145679 - 最后修改: 2004年7月15日 - 修订: 1.2
这篇文章中的信息适用于:
  • Microsoft Visual Basic 5.0 专业版
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic 5.0 企业版
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 标准版
  • Microsoft Visual Basic 4.0 专业版
  • Microsoft Visual Basic 4.0 专业版
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic for Applications 6.0
关键字:?
kbmt kbcode kbhowto kbtophit KB145679 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 145679
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com