|          
中国人民银行郑州培训学院 信息部 潘汉杰  
 Windows注册表跟踪记录了操作系统和各种在系统上安装的应用程序的有关信息。注册表是一个分层数据库。该数据库包含以特定格式表示的配置信息,并且可以直接通过注册表编辑器程序编辑,也可以通过应用程序修改。在早期的Windows版本中,INI文件粗略地完成了这一功能,尽管注册表与INI文件有一些相似之处,但不管怎样,由于组织结构的原因,注册表比传统的INI文件要复杂得多。
 注册表分成若干个主要部分,各个部分(或者说关键字)包含了不同种类的系统信息。比如说,当你创建一个应用程序时,你可以在HKEY_LOCAL_MACHINE这个部分的SOFTWARE子节中注册你的配置信息。应用程序可以把配置信息以多种数据类型(包括字符串、货币、日期、浮点数和布尔值)的形式保存在关键字中。本文通过实例介绍在Delphi的应用程序中如何对Windows 98的注册表进行操作(如:创建关键字、获取一个关键字的数据值、删除关键字、删除关键字中的数据值等),下列示例程序均在Delphi 4.0中调试通过,请放心使用。
 Delphi中定义了一个Tregistry类,通过使用这个类中封装的很多有关对注册表操作的方法和属性可以完成对注册表的操作。
 1、 在注册表中创建一个新的关键字
 Tregistry类中有一个CreateKey方法,使用该方法可以在注册表中创建一个新的关键字,该方法的原型声明为:function CreateKey(const Key: string) : Boolean;
 示例代码如下:
 unit passwd;
 interface
 uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Registry;
 type
 Tpassword = class(TForm)
 Label1: TLabel;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 implementation
 {$R *.DFM}
 procedure Tpassword.Button1Click(Sender: TObject);
 var
 MyReg : TRegistry;
 begin
 MyReg := TRegistry.Create;
 MyReg.RootKey := HKEY_LOCAL_MACHINE;
 try
 if MyReg.OpenKey('\SOFTWARE\',FALSE) then
 if not MyReg.KeyExists('Passwd') then
 begin
 MyReg.CreateKey('Passwd');
 if MyReg.OpenKey('\SOFTWARE\Passwd',FALSE) then
 Label1.Caption := '关键字Passwd已建立!'
 else
 Label1.Caption := '关键字Passwd无法建立!';
 end
 else
 Label1.Caption := '关键字Passwd已经存在!'
 else
 Label1.Caption := '注册表打不开!';
 MyReg.CloseKey;
 finally
 MyReg.Free;
 end;
 end;
 end.
 2、 向注册表关键字中写入相关的数据值
 在Tregistry类中提供了一系列的Write方法用来写入与当前关键字相关的数据值。常用方法的原型定义如下:
 procedure WriteString(const Name, Value : string);
 procedure WriteInteger(const Name : string ; Value : Integer);
 procedure WriteFloat(const Name : string ; Value : Double);
 procedure WriteTime(const Name : string ; Value : TDateTime);
 procedure WriteBool(const Name : string ; Value : Boolean);
 示例代码:
 procedure TForm1.Button1Click(Sender: TObject);
 var
 MyReg : TRegistry;
 begin
 MyReg := TRegistry.Create;
 MyReg.RootKey := HKEY_LOCAL_MACHINE;
 try
 if not MyReg.OpenKey('\SOFTWARE\',FALSE) then ;
 if not MyReg.KeyExists('Passwd') then
 MyReg.CreateKey('Passwd');
 if not MyReg.OpenKey('\SOFTWARE\Passwd',FALSE) then ;
 MyReg.WriteString('pwd1','mypassword1');
 MyReg.WriteInteger('pd2',19642);
 MyReg.CloseKey;
 finally
 MyReg.Free;
 end;
 end;
 3、 从注册表关键字中读出相关的数据值
 在Tregistry类中还提供了与Write方法相对应用的用来读出与当前关键字相关的数据值。常用方法的原型定义如下:
 founction ReadString(const Name : string) : string;
 founction ReadInteger(const Name : string) : Integer;
 founction ReadFloat(const Name : string) : Double;
 founction ReadTime(const Name : string) : TdateTime;
 founction ReadBool(const Name) : Boolean;
 示例程序如下:
 procedure TForm1.Button1Click(Sender: TObject);
 var
 MyReg : TRegistry;
 begin
 MyReg := TRegistry.Create;
 MyReg.RootKey := HKEY_LOCAL_MACHINE;
 try
 if not MyReg.OpenKey('\SOFTWARE\',FALSE) then ;
 if not MyReg.KeyExists('Passwd') then ;
 if not MyReg.OpenKey('\SOFTWARE\Passwd',FALSE) then ;
 Label1.Caption := MyReg.ReadString('pwd1');
 Label2.Caption := IntToStr(MyReg.ReadInteger('pd2'));
 MyReg.CloseKey;
 finally
 MyReg.Free;
 end;
 end;
 4、 从注册表删除关键字或指定的数据值
 使用Tregistry中提供的DeleteKey和DeleteValue方法可以删除指定的关键字和数据值。这两个方法的原型定义如下:
 function DeleteKey(const Key : string) : Boolean;
 function DeleteValue(const Key : string) : Boolean;
 使用DeleteKey方法删除指定的关键字时,如果被删除的关键字在任何层次有子关键字,它们将同时被删除。上面两个方法在执行时,如果删除成功,则返回True;否则返回False。
 示例程序如下:
 procedure TForm1.Button1Click(Sender: TObject);
 var
 MyReg : TRegistry;
 begin
 MyReg := TRegistry.Create;
 MyReg.RootKey := HKEY_LOCAL_MACHINE;
 try
 if not MyReg.OpenKey('\SOFTWARE\Passwd',FALSE) then ;
 if MyReg.DeleteValue('pwd1') then
 label1.Caption := 'value [pwd1] has deleted!';
 MyReg.CloseKey;
 if not MyReg.OpenKey('\SOFTWARE\',FALSE) then ;
 if MyReg.DeleteKey('Passwd') then
 label2.Caption := 'Key [passwd] has deleted!';
 MyReg.CloseKey;
 finally
 MyReg.Free;
 end;
 end;
 通过上面的实例我们简单介绍了Delphi中对注册表的相关操作。在Tregistry类中还有很多对注册表的关键字和数据值的操作方法,但其基本的操作方法和上面的示例程序在同小异,限于篇幅就不赘述了。
 |