Q :怎样用Visual Basic访问Windows注册表
A :回答这个问题取决于你想通过访问注册表达到什么目的。如果你仅仅想保存一些应用程序在运行间的配置信息,那么VB的SaveSetting和GetSetting命令多半满足全部的需要。稍加复杂的解决方案是Windows
Script Host的( WSH) WshShell对象,它提供易于使用的方法访问大多数注册表区域。第三个选择是Win32 API的注册表功能,它哪提供最大灵活性,并且使注册表复杂性可以被孤立出来。
本文,我将介绍你开头两个选择。注册表API的讨论以及它提供的30种功能需要一整篇的文章,所以我将近期再作补充。
简单的但是不灵活的解决方案
VB的 SaveSetting 和 GetSetting 命令让你在注册表存储字符串数据而不费太多功夫。本命令保存任何数据到 HKEY_CURRENT_USERSoftwareVB
的 VBA Program Settings 的 子键(Subkey)。通常你的设置是保存在共用你的应用程序的名称的子键。举例来说,保存上次注册应用程序用户姓名
RegistryHacker,使用以下程序代码:
SaveSetting "RegistryHacker",
"UserManagement", _
"LastUser", "Lamont"
Windows注册表本质上一种为快速读取相对小的数量数据而尽可能优化数据库。它的结构是分层树形结构,差不多类似于Windows文件系统。在根部是Hives,体现最高级的键,像HKEY_CURRENT_USER。树结点是键(KEY),可以包含子键
(Subkeys) 或其他的键,保存在键中的数据被叫值(Values)。Registry值可以保存多种的数据,包括简单的字符串, 32 -/ 64-bit整数,二进制数据和字符串数组。
执行上述程序代码创建键RegistryHacker 和子键 UserManagement (如果他们没有存在),添加值LastUser到UserManagement
(如果该子键存在), 并且保存字符串 " Lamont " 到值。附图A显示程序运行结果。

点击扩大
为从注册表取回这个信息,可以使用GetSetting,代码如下:
strUser = GetSetting("RegistryHacker",
_
"UserManagement", "LastUser")
VB也提供DeleteSetting命令允许你删去以前通过SaveSetting存储值。
如同你所了解到的,GetSetting和SaveSetting的使用非常简单的。然而,他们不是非常强大。如果你需要从键而非VB和VBA Program
Settings Key子键读取值该怎样办呢?假定你需要保存一些二进制数据? 或者你只是不想宣传你的应用是VB写的这个事实?
Good old WSH
如果你需要比GetSetting 和SaveSetting提供更多灵活性但是不想涉及注册表API复杂性的解决方案,你可以利用WSH WshShell对象。WshShell三个方法:RegRead,
RegWrite,和RegDelete。这些方法允许你操作注册表大部分域。只是在你的工程中必须参考Windows Script Host Object
Model ( wshom.ocx)。
为从注册表键读出数据,使用RegRead方法,它可以接受键的路径,或者注册表值作为一个参数。举例来说, 读取上面我们创建UserManagement中
LastUser值,我们可以使用以下程序代码,假定o是WshShell 对象例示:
strUser = o.RegRead("HKEY_CURRENT_USER" _
& "SoftwareVB and VBA Program Settings" _
& "RegistryHackerUserManagementLastUser")
用RegWrite方法,你可以容易地向注册表写入数据:
o.RegWrite "HKEY_CURRENT_USERSoftwareVB " _
& "and VBA Program SettingsRegistryHacker" _
& "UserManagementLastUser", "Adams"
为什么WSH的方法优于GetSetting和SaveSetting?
用WshShell,可以访问大多数可用的Hives下面的键。也可以使用WshShell定义一组Hive缩写名称代替完整hive名称。(参见图B) :

WSH假定如果你指定姓名用反斜线符号( )结束,那么你给定的指一个键的名称。相反,你提供名称不以反斜线符号结尾,那么WSH会假定你刚指定的是一个值。
注册表数据类型
直到现在,我们仅仅是保存和检索简单的字符串。然而,注册表可以处理12不同的数据类型。估计大多数那些你可能不会关心如何使用VB访问-即使你可以。WshShell对象可以处理五种数据类型(参见图C)。

点击放大
当使用RegWrite,你要指定保存数据的类型,通过附图C数据类型名字作为其可选择的类型参数。如果你不指定类型, RegWrite假定你使用REG_SZ。
这时你多半会问, "我如何用RegRead指定数据类型? ",你不需要。记住WSH的支持脚本语言比如VBScript和Jscript,两个中没有一个有可变类型变量的任何概念。RegRead总是返回变体变量类型,
VB自动地强迫转换成为另一个类型。大多数的情况下将REG_DWORD变成字符串取出来问题不大,但是当写注册表的时候你要小心。
删去注册表键的RegDelete方法,将删除你指定键中包含的全部子键和值。
遗漏的部份
在本文论述的两个注册表存取方法有有利的方面。如果你全部的需求仅仅对在执行间保存一些变量感兴趣,那么GetSetting和SaveSetting多半满足你全部需要。然而,如果你需要访问其他的注册表域,那么WshShell解决方案值得一看。你同时应该意识到,因为最近脚本病毒非常流行,WSH受到了强烈的质疑并且近期多半会做巨大改变(也就是说会削弱一部分功能)。
我谈到两个方法中没有允许你创建新键或者提供任何枚举键中包含子键或者值得方法。如果你需要高级功能,需要寻找第三方的组件或者使用注册表API。我将未来提供相关的文章。
责任编辑:小李(Email:li_shuangzhen@zdnet.com.cn) |