用注册表保存数据(vb函数篇)
作 者 : 扬眉
简介
注册表最开始是出现在windows 3.x,是用来为ole保存数据的。那时windows和其应用程序的设置值大多都
保存在各不相同的.ini文件中。例如我们最为熟悉的system.ini和win.ini就是这样的文件。当软件越安越多,
这种文件也越来越多,而且遍布硬盘的各个角落。既不便于管理,也浪费了很多磁盘空间(因为这些文件大多都很小)。
当windows 95推出的时候,注册表应运而生。所有的设置值,不论是系统的,还是应用程序的,
都被保存在一个树型结构的数据库中。这样确实方便了不少,而且对多用户环境提供了更好的支持。而对程序员而言就麻烦了一些,
必须了解的是注册表的结构,又因为注册表不再是单一的文本文件,所以必须用专门函数来操作注册表。
注册表(registry)是保存程序运行参数和用户设置的最佳地方。听过了太多的告诫,编辑注册表对很多人来
说似乎是一件神秘而复杂的事,但在vb中,通过四个注册表函数,一切都变得简单起来。
如果你对注册表有一些了解,那么应该知道注册表的结构和我们所熟悉的文件系统的结构是一样的,都是树型结构。
用主键来代替目录以划分各种不同的信息。在主键下面还可以有子主键和三种不同类型的键值。每个键值可以是字符串,
二进制值或者双字值中的一种。visual basic 提供了一个标准的注册位置(主键)以存储创建于 visual basic
的应用程序的程序信息: hkey_current_user\software\vb and vba program settings\
下面的所有函数所读写的注册表路径都是以这个路径为根的相对位置。
savesetting
这个函数用来向注册表数据库写入一些数据
savesetting appname, section, key, setting
appname
在向注册表写入数据之前,你必须计划好一个用在整个应用程序中的appname 。可以把注册表的内容比作一台计算机,
那么appname就是驱动器。它必须是一个字符串,也可以用数字,不过要用cstr 函数把它转换成字符串格式。
事实上它代表的是应用程序或工程的名称。一般来说,appname在整个应用程序中应该保持不便。
section
section可以说是这个模型中的目录,就向一台计算机上的目录一样。它用来把设置分类,可以包含key或者子section。
如果给它传递vbnullchar 这个值的话,就表示要操作的键是在根目录下的,也就是在appname下面的。
key
相当于一个文件名。
setting
它代表文件中的信息,可以是一个数字或者字符串。
执行完后,在注册表的hkey_current_user\software\vb and vba program settings\appname\section\"主键下面
的名为“key”的键将被赋值为“setting”,
如果相应的主键或者键名不存在,将会被创建。
getsetting
这个函数用来从注册表中提取数据。
getsetting(appname, section, key[, default])
appname,section和key的含义和上面的一样。
default
如果visual basic没有找到指定的键,函数将返回参数default中得值。这个参数是可选的,但是对错误情况的处理很方便。
如果没有选用这个参数,
而指定的键的名称不存在,函数将返回一个长度为0的字符串。
下面看看例子:
savesetting "logon master", "users\user0", _
"name", "john"
注释:这将把数据"john"储存到注册表的 "logon master\users\user0\name"
注释:不过这是相对路径,相对于一个根
debug.print getsetting("logon master", _
"users\user0", "name", "anonymous"
注释:这将显示"john"
debug.print getsetting("logon master", _
"users\user1", "name", "anonymous"
注释:这次显示的将是"anonymous",因为在
注释:"logon master\users\user1\name"没有预先储存值。
getallsettings
这个函数用来提取某个目录(主键)下面的所有文件(子键)。
getallsettings(appname, section)
参数的含义和其他的函数都是一样的。但这个函数和其他几个比起来更为复杂。他返回的的是一个2维字符串数组,包含了所有的子键名称和乡音的子键值。看看下面这个例子,你很容易的就能搞清楚:
注释: 定义一个variant类型的变量来保存getallsettings返回的二维数组
注释: interger类型值用来计数
dim mysettings as variant, intsettings as integer
注释:先在注册表中填入一些值
savesetting "logon master", "users\user0", _
"name", "john"
savesetting "logon master", "users\user0", _
"priviledges", "supervisor"
注释:提取预先设定的数据
mysettings = getallsettings("logon master", _
"users\user0")
注释:显示出来
for intsettings = lbound(mysettings, 1) _
to ubound(mysettings, 1)
注释:mysettings(x,0)中包含的是键名,
注释:而mysettings(x,1) 中包含的是键值
debug.print mysettings(intsettings, 0), _
mysettings(intsettings, 1)
next intsettings
注意:getallsettings并不返回目录名,只是返回键名和相应的键值。
deletesetting
除了保存和提取数据,我们还要能够删除注册表中的注册项。这就要用到deletesetting函数了。
deletesetting appname[, section[, key]]
这个函数用来删除主键或者键。如果要删除的是键,要给出它所在的键名。如果要删除的是主键,这它下面所有的键和子主键都会被删除。如果你要删除应用程序所有的注册表信息,就只用指定appname就可以了。
例如:
deletesetting "logon master", "users\user0", "name"
注释:这将删除name键。
deletesetting "logon master", "users"
注释:这将删除"logon master\users"主键和其下的所有内容。
deletesetting "logon master"
注释:这将删除应用程序"logon master"下面的所有内容。