注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着Windows的启动、硬件驱动程序的装载以及一些Windows应用程序的运行,从而在整个系统中起着核心作用。
其作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等。
具体来说,在启动 Windows 时,Registry 会对照已有硬件配置数据,检测新的硬件信息;系统内核从 Registry 中选取信息,包括要装入什么设备驱动程序,以及依什么次序装入,内核传送回它自身的信息,例如版权号等;同时设备驱动程序也向 Registry 传送数据,并从 Registry 接收装入和配置参数,一个好的设备驱动程序会告诉Registry 它在使用什么系统资源,例如硬件中断或 DMA 通道等,另外,设备驱动程序还要报告所发现的配置数据;为应用程序或硬件的运行提供增加新的配置数据的服务。配合 ini 文件兼容16位 Windows 应用程序,当安装—个基于 Windows 3.x 的应用程序时,应用程序的安装程序 Setup 像在 Windows 中—样创建它自己的 ini 文件或在 win.ini 和 system.ini 文件中创建入口;同时 Windows 还提供了大量其他接口,允许用户修改系统配置数据,例如控制面板、设置程序等。
如果注册表受到了破坏,轻则使 Windows 的启动过程出现异常,重则可能会导致整个 Windows 系统的完全瘫痪。因此正确地认识、使用,特别是及时备份以及有问题恢复注册表对 Windows 用户来说就显得非常重要。
在软件开发中,有的时候我们要实现的功能需要涉及到注册表的操作,今天,我们以 Delphi 为例来说明在 Delphi 中怎么样操作 Windows 注册表,同样适用于 Lazarus 和 CodeTyphon 开发工具。
Delphi程序中可以使用 TRegistry 对象来存取注册表文件中的信息,所以在 uses 中应该包括如下单元:
Registry, Windows
TRegistry 对象
创建和释放
在进行注册表操作前,需要创建 TRegistry 对象,操作结束后,应释放该对象。
var
ARegistry: TRegistry;
ARegistry:=TRegistry.Create;
ARegistry.Free;
键
操作注册表时,首先应指定操作的主键,首先通过属性 RootKey 赋值以指定根键,然后使用 OpenKey 方法来指定要操作的主键名。
指定根键 (RootKey)
根键是注册表的入口,也注册表信息的分类,其值为:
|
值 |
作用 |
|
HKEY_CLASSES_ROOT |
存储整个系统对象类信息,如 ActiveX 对象注册、文件关联等信息 |
|
HKEY_CURRENT_USER |
存储当前用户的配置信息,为属性 RootKey 的默认值 |
|
HKEY_LOCAL_MACHINE |
存储当前系统的软硬件配置信息,应用程序自己的信息可以存储在该根键下 |
|
HKEY_USERS |
存储所有用户通用的配置信息 |
|
HKEY_CURRENT_CONFIG |
定义了计算机的当前配置情况,如显示器、打印机等可选外设及其设置信息等 |
|
HKEY_DYN_DATA |
存放了系统在运行时动态数据 |
指定要操作的主键
function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
参数:
- Key - 主键名,是键名全名中除去根键的部分。
- CanCreate - 在指定的主键名不存在时,是否允许创建该主键,True表示允许
返回值:
- True 表示操作成功
关闭当前主键
在读取或存储信息之后,应及时将关闭当前主键:
procedure CloseKey;
读取
Read 系列方法从注册表读取指定的信息(字符串、二进制和十六进制),并转换为指定的类型。 function
|
方法 |
功能 |
|
ReadString(const Name: string): string; |
读取一个字符串值,Name为字符串名称。 |
|
function ReadInteger(const Name: string): Integer; |
读取一个整数值,Name为整数名称。 |
|
function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer):Integer; |
读取二进制值,Name为二进制值名称,Buffer为接收缓冲区,BufSize为缓冲区大小,返回为实际读取的字节数。 |
其它方法:ReadBool、ReadCurrency、ReadDate、ReadDateTime、ReadFloat、ReadTime。
写入
Write 系列方法将信息转化为指定的类型,并写入注册表。
|
方法 |
功能 |
|
procedure WriteString(const Name, Value: string); |
写入一个字符串值,Name为字符串的名称,Value为字符串值。 |
|
procedure WriteInteger(const Name: string; Value: Integer); |
写入一个整数值。 |
|
procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer); |
写入二进制值,Name为二进制值的名称,Buffer为包含二进制值的缓冲区,BufSize为缓冲区大小。 |
其它方法:WriteBool、WriteCurrency、WriteDate、WriteDateTime、WriteFloat、WriteTime。
键值维护
除了在注册表中读写外,还可以增加主键、删除主键、主键改名、数据值改名等。
1.创建新主键
function CreateKey(const Key: string): Boolean
Key 为主键名,返回值 True 表示操作成功。
2.删除主键
function DeleteKey(const Key: string): Boolean
Key 为主键名,返回值 True 表示操作成功。
3.复制或移动主键
procedure MoveKey(const OldName, NewName: string; Delete: Boolean)
OldName、NewName 分别表示源主键名和目标主键名;
Delete表示是否删除源主键,True表示删除,False表示保留。
复制或移动一个主键将复制或移动该子键下的所有数据值和子键内容。
4.判断指定主键是否存在,
function KeyExists(const Key: string): Boolean;
返回值为True表示主键存在。
5.判断指定主键下是否有子键
function HasSubKeys: Boolean;
返回值为True表示主键下有子键。
6.获取子键名称
procedure GetKeyNames(Strings: TStrings);
Strings用于返回当前主键下各子键的名称。
7.获取主键下的数据值名称
procedure GetValueNames(Strings: TStrings);
Strings用于返回当前主键下各数值名称。
8.判断数值名称是否存在
function ValueExists(const Name: string): Boolean;
返回值为True表示数值名称存在。
9.数值名称改名
procedure RenameValue(const OldName, NewName: string);
以上是注册表常用操作所对应的TRegistry的方法和属性
示例
创建一个可以使用 url 打开的应用程序,需要进行注册表写入,代码如下:
procedure WtiteToRegistry;
var
ARegistry: TRegistry;
begin
ARegistry:=TRegistry.Create;
ARegistry.RootKey:=HKEY_CLASSES_ROOT;
if ARegistry.KeyExists('\hipereport') then ARegistry.DeleteKey('hipereport');
if ARegistry.OpenKey('\hipereport', True) then
begin
ARegistry.WriteString('', 'URL:hipereport Protocol Handler');
ARegistry.WriteString('URL Protocol', '');
end;
if ARegistry.OpenKey('\hipereport\DefaultIcon', True) then
begin
ARegistry.WriteString('', BaseDir + 'hipereport*ex.e**');
end;
if ARegistry.OpenKey('\hipereport\shell', True) then
begin
ARegistry.WriteString('', '');
end;
if ARegistry.OpenKey('\hipereport\shell\open', True) then
begin
ARegistry.WriteString('', '');
end;
if ARegistry.OpenKey('\hipereport\shell\open\command', True) then
begin
ARegistry.WriteString('', '"' + BaseDir + 'hipereport*ex.e**" ' + '"%1"');
end;
ARegistry.CloseKey;
ARegistry.Free;
end;