WIN32汇编语言教程:第15章 注册表和INI文件 · 15.3 对注册表的操作(1)

注册表在Windows 9x及NT系统中是很重要的,不谈操作系统本身对注册表依赖性的大小,仅从应用程序的角度来说,注册表除了用来代替INI文件用做保存配置信息以外,有些功能是必须通过操作注册表来完成的,比如要让一个程序在Windows启动的时候自动运行,那就必须在注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\Run子键下面添加一个键值定义;如果要让应用程序和某种数据文件相关联,就必须在注册表的HKEY_CLASSES_ROOT键下面为相应的数据文件扩展名设置关联信息;再比如,编写好一个COM组件以后,要为组件的DLL文件在注册表中添加注册信息,组件才能被其他程序使用。另外,操作系统本身将绝大多数的配置信息保存于注册表中,应用程序在运行中往往需要查询这些系统信息来决定运行的方式。

要自如地使用注册表,必须解决两方面的问题,第一是如何在程序中对注册表进行读写与枚举等操作;第二就是要搜集整理关于注册表键值定义的资料。因为注册表是Windows中出了名的“数据迷宫”,很多键的定义只有Microsoft自己知道,公开的键定义也足够编成一本手册了,仅知道如何读写注册表却不知道该往哪里读写是没用的。本节并不是当做注册表的定义手册来写的,所以内容仅涉及第一个方面的问题。本节讨论的内容是:注册表的数据组织方式以及如何用Win32汇编来读写和枚举注册表的内容。

15.3.1 注册表的结构

1. 注册表的数据组织方式

INI文件中的数据是按照两层组织的——只能通过一些在结构上“平行”的小节来归类不同的键,这就像一个驱动器中只能建立一层目录来管理文件一样非常不便,与此相比,注册表的结构有很大改进。

注册表中的数据是分多个层次来组织的,组织的方式类似于磁盘目录的多层组织方式。与文件系统中根目录、子目录和文件这样的层次划分类似,注册表中的数据层次分为根键、键和键值项,其中根键就相当于文件系统中的根目录,键相当于子目录,键值项相当于文件。根键和子键是为了将不同的键值项分类组织而定义的,只有键值项中才包含真正的配置数据。

在Windows自带的注册表编辑器Regedit中就可以看出注册表的结构来。如图15.2所示,注册表中的根键有6个,其名称是Windows规定的,并且是固定不变的,它们分别是HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_CURRENT_CONFIG,HKEY_DYN_DATA和HKEY_USERS。在每个根键下可以建立不同的键,以HKEY_LOCAL_MACHINE根键为例,下面有HARDWARE,SAM,SECURITY和SOFTWARE等子键,而SOFTWARE键下面又建立了ACD Systems,Acer和Adobe等子键,键和子键的关系是相对的,就像一个目录既可以是其上层目录的子目录,又可以是其下层目录的父目录一样。

在一个键中既可以继续建立多个子键,也可以同时建立多个键值项,就像一个目录中既可以建立多个子目录,同时也可以存放多个文件一样。图15.2右边窗口中列出的就是ACDSee键中定义的键值项。


图15.2 注册表的结构

每个键值项由键值名称和键值数据组成(就像是文件名和文件中的数据的关系),如键值名称AppMode中的数据是“00 00 00 00”、键值名称UserName中的数据是“aaa”。不像INI文件中的键值只能定义为字符串,注册表键值的数据类型要丰富得多,全部可用的键值类型如表15.1所示。

表15.1 注册表的键值类型

键值类型说明
REG_BINARY任何方式的二进制数据
REG_DWORD一个32位的双字(同REG_DWORD_LITTLE_ENDIAN)
REG_DWORD_BIG_ENDIAN高位排在低字节的双字
REG_EXPAND_SZ扩展字符串,可以将中间类似于“%PATH%”类型的子串按照环境变量中的定义值扩展
REG_LINKUnicode符号链接
REG_MULTI_SZ多字符串,格式为“字符串1,0,字符串2,0,0”类型
REG_RESOURCE_LIST设备驱动程序资源列表
REG_SZ以0结尾的字符串(最常用的类型!)

图15.2中的AppMode和UsageCount键值项是REG_BINARY类型的,WindowsPosition键值项是REG_DWORD类型的,其余的键值项是REG_SZ类型的,这3种类型的键值项在注册表中是最常见的。每个键下面还可以有一个没有名称的键值项,称为默认键,默认键必须是REG_SZ或REG_EXPAND_SZ类型的。

2. 注册表中的根键

注册表的结构中大量采用“映射”关系,系统定义的6种根键其实存放在不同的文件中。在Windows 9x系统中,HKEY_LOCAL_MACHINE根键的内容存放在System.dat文件中,HKEY_USERS根键的内容存放在User.dat文件中。而在Windows NT系统中,注册表的内容存放得更分散,连HKEY_LOCAL_MACHINE根键中的不同子键SOFTWARE,SAM,SECURITY和SYSTEM等都分开存放在Windows\system32\config目录下的不同文件中。

HKEY_LOCAL_MACHINE和HKEY_USERS根键是注册表中的两大根键,其余的根键都是它们的派生,实际上它们都是这两大根键下面某些子键的映射,如HKEY_CLASSES_ROOT根键是HKEY_LOCAL_MACHINE根键下SOFTWARE\Classes子键的映射,HKEY_CURRENT_CONFIG根键是HKEY_LOCAL_MACHINE根键下Config子键的映射。

HKEY_USERS根键中的内容是用户配置信息,其内容取决于计算机是否激活了用户配置文件。若未激活用户配置文件,则里面只有名为 .DEFAULT的单一子键,该子键包括与所有用户相关的各种设置。若激活了用户配置文件并且正确地执行了登录操作,则根键下还会有代表当前登录用户的子键,这时候HKEY_CURRENT_USER根键就是这个子键的映射。

HKEY_DYN_DATA保存了系统运行时的动态数据,它反映出系统的当前状态,所以它的数据在每次运行时都是不一样的。应用程序一般不使用这个根键。

对这些实际上是其他数据的映射的根键来说,操作根键上的数据和操作未经映射前的数据产生的效果是一样的,系统建立映射可以让键值数据的组织更清晰,操作起来更加快捷方便。

15.3.2 管理子键

本节用一个例子来演示对注册表的操作方法,例子代码在所附光盘的Chapter14\Reg目录中,运行后的界面如图15.3所示。例子程序演示了子键的创建和删除,键值项的创建、读取和删除,以及枚举子键和键值项的功能。


图15.3 注册表操作例子的运行界面

上页:第15章 注册表和INI文件 · 15.2 INI文件的操作(4) 下页:第15章 注册表和INI文件 · 15.3 对注册表的操作(2)

第15章 注册表和INI文件

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号