2.2 内置注册表函数
注册表是Windows系统中的一个系统数据库,主要存储硬件配置、软件设置等信息。注册表的操作主要有创建注册表项、删除注册表项、修改注册表项、读取注册表项等。
在实际编程过程中,可以把开发的程序中的一些变量的值存储在注册表中,也可以从注册表中读取内容,让程序加以利用。因此注册表操作很有必要学习和研究。
VBA操作注册表的方式有多种,本节介绍VBA、VB6的几个内置函数。
GetSetting:根据指定的路径获取注册表项的值。
GetSettings:与GetSetting类似,返回一个数组。
SaveSetting:保存内容到注册表中。
DeleteSetting:删除一个注册表项。
需要注意的是,上述4个内置函数的操作范围只限于HKEY_CURRENT_USER\Software\VB and VBA Program Setting这个键值内部。
按下快捷键【Windows +R】,输入regedit,按回车键即可弹出注册表编辑器。然后依次单击节点HKEY_CURRENT_USER\Software\VB and VBA Program Setting,就可以进入该文件夹中,如图2-19所示。
图2-19 VB、VBA专用的注册表项
以上四个内置函数的参数几乎都包含AppName、Section、Key三个层级。
以图中所选的节点为例,AppName、Section、Key依次是CnChessQipu、DataBase、FileName。
2.2.1 GetSetting
GetSetting的作用是从指定的层级获取Key的属性值,返回一个字符串。
运行上述过程,对话框中返回注册表中FileName的属性值,如图2-20所示。
与注册表中对比,完全一致,如图2-21所示。
图2-20 获取注册表信息
图2-21 核对获取的结果
需要注意的是,如果GetSetting函数的三个参数中的任何一个写错,都将造成找不到注册表项,不会出现运行错误,而是返回一个空字符串。
2.2.2 SaveSetting
在使用SaveSetting函数的过程中,如果指定的层级存在,就修改现有层级的属性值;如果层级不存在,则会自动创建层级路径。
SaveSetting是对注册表的修改,没有返回值,因此后面的参数不需要括号。
运行下面的过程,修改FileName这个Key的属性值。
刷新一下注册表,看到属性值已修改,如图2-22所示。
图2-22 修改注册表信息
在编程开发过程中,经常需要在一个Section下面建立多个Key,此时会对应多个属性值。下面以世界各国信息为例,说明一下注册表项的存取过程,如表2-3所示。
表2-3 世界各国基本信息表
假设要把表2-3中的内容保存到注册表中,那么“国家”这一列就相当于Section,而首都、国土面积和人口都是Key,要分别保存。以上所有项目都位于“世界大国”这个AppName下面。
运行上述过程,刷新注册表,可以看到注册表中已存在相关信息,如图2-23所示。
图2-23 批量存入注册表
2.2.3 DeleteSetting
DeleteSetting用于删除一个注册表节点,这里的节点可以是AppName、Section、Key中的任何一个。
DeleteSetting需要指定的参数也是三个,但是根据需要,可以更改参数个数。规定的参数越少,删除的层级越高,删除的内容也越多。
DeleteSetting "世界大国", "加拿大", "国土面积"
表示删除加拿大的国土面积这个Key和属性。
DeleteSetting "世界大国", "加拿大"
表示删除加拿大这个Section,也就是删除加拿大这个文件夹。
DeleteSetting "世界大国"
将会删除整个AppName根节点。
2.2.4 GetAllSettings
获取注册表的方法,除了前面讲过的GetSetting函数以外,还可以用GetAllSettings函数一次性获取一个Section下面的所有Key及其属性值。获取到的内容是一个多行2列的二维数组。
下面的代码把“中国”这个Section的所有属性装载到字符串数组v()中。
单步执行上述过程,可以在本地窗口看到v()是一个3行2列的二维数组,如图2-24所示。
图2-24 一次性获取全部注册表信息
为了把数组放到Excel单元格中,采用Range的Resize方法根据数组大小自动扩展区域。运行上述过程后,表格单元格的结果如图2-25所示。
以上内容的源代码文件为“实例文档07.xlsm”。
以上四个注册表操作函数一般用于产品开发时存取程序信息,如果要操作其他场所的注册表项,需要用到2.3节讲述的WshShell对象。
图2-25 将注册表信息发送到单元格