如何用delphi对注册表进行操作?(50分)

A

a2020a

Unregistered / Unconfirmed
GUEST, unregistred user!
给个例子,源码,我是win2000,xp,me,98。
 
操作注册表需要认识到注册表的六个根键。看看DELPHI的定义:

const
{ Reserved Key Handles. }
{$EXTERNALSYM HKEY_CLASSES_ROOT}
HKEY_CLASSES_ROOT = DWORD($80000000);
{$EXTERNALSYM HKEY_CURRENT_USER}
HKEY_CURRENT_USER = DWORD($80000001);
{$EXTERNALSYM HKEY_LOCAL_MACHINE}
HKEY_LOCAL_MACHINE = DWORD($80000002);
{$EXTERNALSYM HKEY_USERS}
HKEY_USERS = DWORD($80000003);
{$EXTERNALSYM HKEY_PERFORMANCE_DATA}
HKEY_PERFORMANCE_DATA = DWORD($80000004);
{$EXTERNALSYM HKEY_CURRENT_CONFIG}
HKEY_CURRENT_CONFIG = DWORD($80000005);
{$EXTERNALSYM HKEY_DYN_DATA}
HKEY_DYN_DATA = DWORD($80000006);

它们必须在TRegistry变量的RootKey属性中指定。
要取得某一个路径的某个键值,必须找到某一个主键,例如有如下一个路径存放着WORD97存放的程序路径:
/Software/Microsoft/Office/8.0/Word/InstallRoot/Path
其中,PATH是键,在它前面的便是主键(键的路径),而这些键又是放在HKEY_LOCAL_MACHINE这个根键中的。当然,我们想要的是PATH对应的数据,而不是想知道有PATH这个键存在。PATH的类型是一个字符串,所以需要一个字符串变量存放它,例程中使用直接显示的方法表达它。

因此,读出PATH键数据的过程就应该是,确定根键,进入主键(路径),读出键的数据值。为了体现对注册表的写操作,我们还特意创建一个主键/Software/3hsoft和里面一个字符串的键MyData。

下面是一小段关于此过程的程序,虽然内容不多,但基本上已经将读写的操作表现出来了。


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Registry; // 记得要加入这个。
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
Const
FPath = '/Software/Microsoft/Office/8.0/Word/InstallRoot';
FKey = 'Path';
FMyPath = '/Software/3hSoft';
FMyKey = 'MyData';
Var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
If Reg.OpenKey(FPath, False) then
ShowMessage(Reg.ReadString(FKey)); // 读出的 WinWord 的路径就显示出来了。
Reg.CreateKey(FMyPath); // 创建我们的主键
Reg.OpenKey(FMyPath, True); // 进入我们自己的主键中
Reg.WriteString(FMyKey, 'This is a registry operation test program.');
// 写进键值。
finally
Reg.Free; // 用 Try..Finally 结构确保 REG 变量能够释放。
end;
end;
end.

这个是我从别的地方摘抄的,呵呵,,,希望对你有所帮助
 
Delphi中对注册表的操作一般为以下步骤:

1. 在uses中加入Registry
例如:
unit unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,Registry; //<-- 加入

2. 定义变量类型为TRegistry
例如:
var
temp:TRegistry;
...

3. 创建变量
例如:
...
temp:=TRegistry.create;
...
4. 修改TRegistry类型变量的Rootkey(根键值)属性, 缺省情况下, 当创建了一个TRegisrty类型
变量时,它的Rootkey属性等于HKEY_CURRENT_USER, 如对于上例: 在执行完temp:=TRegistry.create
后, temp.rootkey就等于HKEY_CURRENT_USER.
在Windows中主要包括以下根键值:
HKEY_CLASS_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USER
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
你可以根据你的需要来设定根键值:
例如: 要对HKE_LOCAL_MACHINE根键值进行操作,即:
...
temp.rootkey:=HKEY_LOCAL_MACHINE;
...
5. 设定完根键值之后, 要打开具体子键以对其进行操作,这一步用来openkey实现
例如:
var
temp:TRegistry;
begin
temp:=TRegistry.create;
try
with temp do
begin
rootkey:=HKEY_LOCAL_MACHINE;
openkey('Software/Microsoft/Windows/CurrentVersion/Policies/Explorer',false);
...
end;
finally
temp.free
end;
对openkey函数的第二个参数(boolean类型)要注意: 为true: 打开子键, 如该子键不存在则建立之
为false:不建立.

6. 进行基本操作
基本操作包括: 判断键值是否存在---valueexists
读写键值-----------般常用的有:
readinteger writeinteger
readstring writestring
readbinarydata writebinarydata
readfloat writefloat
其余的请看Delphi帮助 :)
例如:
var
temp:TRegistry;
i:string;
begin
temp:=TREgistry.create;
try
with temp do
begin
rootkey:=HKEY_LOCAL_MACHINE;
openkey('Config/0001/Display/Settings',false);
if valueexists('BitsPerPixel') then
//该键值存在
i:=readstring('BitsPerPixel')
else //该键值不存在
...
end;
finally
temp.free
end;
...

 
32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。

  一、创建和释放TRegistry对象

  1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create;

  2.释放TRegistry对象。对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy。

  二、指定要操作的键

  操作注册表时,首先应指定操作的主键:先给属性RootKey赋值以指定根键,然后用方法OpenKey来指定要操作的主键名。

  1.指定根键(RootKey)。

  根键是注册表的入口,也注册表信息的分类,其值可为:

  HKEY—CLASSES—ROOT:存储整个系统对象类信息,如ActiveX对象注册、文件关联等信息。

  HKEY—CURRENT—USER:存储当前用户的配置信息。为属性RootKey的默认值。

  HKEY—LOCAL—MACHINE:存储当前系统的软硬件配置信息。应用程序自己的信息可以存储在该根键下。

  HKEY—USERS:存储所有用户通用的配置信息。

  还可以是HKEY—CURRENT—CONFIG、HKEY—DYN—DATA。

  2.指定要操作的主键。

  Function OpenKey(const Key: string; CanCreate: Boolean): Boolean;

  Key:主键名,是键名全名中除去根键的部分,如Software/Borland/Delphi。

  CanCreate:在指定的主键名不存在时,是否允许创建该主键,True表示允许。

  返回值True表示操作成功。

  3.关闭当前主键。

  在读取或存储信息之后,应及时将关闭当前主键:procedure CloseKey。

  三、从注册表中读取信息

  Read系列方法从注册表读取指定的信息(字符串、二进制和十六进制),并转换为指定的类型。

  1.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。

  2.读取信息一例(显示Windows的版本)。

  在HKEY—LOCAL—MACHINE/Software/Microsoft/Windows/CurrentVersion下,有三个字符串值Version、VersionNumber和SubVersionNumber,用于记录当前Windows的版本号。

  {请在Uses中包含Registry单元}

  procedure TForm1.Button1Click(Sender:TObject);

  var

   ARegistry : TRegistry;

  begin

   ARegistry := TRegistry.Create;

  //建立一个TRegistry实例

   with ARegistry do

   begin

   RootKey := HKEY—LOCAL—MACHINE;//指定根键为HKEY—LOCAL—MACHINE

   //打开主键Software/Microsoft/Windows/CurrentVersion

   if OpenKey( ′Software/Microsoft/Windows/CurrentVersion′,false ) then

   begin

   memo1.lines.add('Windows版本:′+ ReadString(′Version′));

   memo1.lines.add('Windows版本号:′ + ReadString(′VersionNumber′));

   memo1.lines.add(′Windows子版本号:′ + ReadString(′SubVersionNumber′));

   end;

   CloseKey;//关闭主键

   Destroy;//释放内存

   end;

  end;

  四、向注册表中写入信息

  Write系列方法将信息转化为指定的类型,并写入注册表。

  1.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。

  2.写入信息一例。

  下面程序使Delphi随Windows启动而自动运行。

  var

   ARegistry : TRegistry;

  begin

   ARegistry := TRegistry.Create;

  //建立一个TRegistry实例

   with ARegistry do

   begin

   RootKey:=HKEY—LOCAL—MACHINE;

   if OpenKey(′Software/Microsoft/Windows/CurrentVersion/Run′,True) then

   WriteString(′delphi′,′C:/Program Files/borland/delphi3/bin/delphi32.exe′);

   CloseKey;

   Destroy;

   end;

  end;

  五、键值维护

  除了在注册表中读取、存储外,程序可能还需要增加主键、删除主键、主键改名、数据值改名等。

  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.判断指定主键是否存在,其下是否有主键,并获取主键名称。

  KeyExists用于判断指定主键是否存在:

  function KeyExists(const Key: string): Boolean;//返回值为True表示主键存在。

  HasSubKeys用于判断指定主键下是否有子键:function HasSubKeys: Boolean;

  返回值为True表示主键下有子键。

  GetKeyNames用于获取子键名称:procedure GetKeyNames(Strings: TStrings);

  Strings用于返回当前主键下各子键的名称。

  5.获取主键下的数据值名称:procedure GetValueNames(Strings: TStrings)。

  Strings用于返回当前主键下各数值名称。

  如要获取当前系统中的拨号连接名称,可利用获取主键HKEY—USERS

  /.DEFAULT/RemoteAccess/Addresses下的数值名称的方法来进行。

  6.判断数值名称存在、数值名称改名。

  ValueExists用于判断数值名称是否存在:

  function ValueExists(const Name: string): Boolean;

  返回值为True表示数值名称存在。

  RenameValue用于数值名称改名:

  procedure RenameValue(const OldName, NewName: string);

  以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。

 
给个删除的例子,好吗?
 
操作注册表需要认识到注册表的六个根键。看看DELPHI的定义:

const
{ Reserved Key Handles. }
{$EXTERNALSYM HKEY_CLASSES_ROOT}
HKEY_CLASSES_ROOT = DWORD($80000000);
{$EXTERNALSYM HKEY_CURRENT_USER}
HKEY_CURRENT_USER = DWORD($80000001);
{$EXTERNALSYM HKEY_LOCAL_MACHINE}
HKEY_LOCAL_MACHINE = DWORD($80000002);
{$EXTERNALSYM HKEY_USERS}
HKEY_USERS = DWORD($80000003);
{$EXTERNALSYM HKEY_PERFORMANCE_DATA}
HKEY_PERFORMANCE_DATA = DWORD($80000004);
{$EXTERNALSYM HKEY_CURRENT_CONFIG}
HKEY_CURRENT_CONFIG = DWORD($80000005);
{$EXTERNALSYM HKEY_DYN_DATA}
HKEY_DYN_DATA = DWORD($80000006);

它们必须在TRegistry变量的RootKey属性中指定。
要取得某一个路径的某个键值,必须找到某一个主键,例如有如下一个路径存放着WORD97存放的程序路径:
/Software/Microsoft/Office/8.0/Word/InstallRoot/Path
其中,PATH是键,在它前面的便是主键(键的路径),而这些键又是放在HKEY_LOCAL_MACHINE这个根键中的。当然,我们想要的是PATH对应的数据,而不是想知道有PATH这个键存在。PATH的类型是一个字符串,所以需要一个字符串变量存放它,例程中使用直接显示的方法表达它。

因此,读出PATH键数据的过程就应该是,确定根键,进入主键(路径),读出键的数据值。为了体现对注册表的写操作,我们还特意创建一个主键/Software/3hsoft和里面一个字符串的键MyData。

下面是一小段关于此过程的程序,虽然内容不多,但基本上已经将读写的操作表现出来了。


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Registry; // 记得要加入这个。
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
Const
FPath = '/Software/Microsoft/Office/8.0/Word/InstallRoot';
FKey = 'Path';
FMyPath = '/Software/3hSoft';
FMyKey = 'MyData';
Var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
If Reg.OpenKey(FPath, False) then
ShowMessage(Reg.ReadString(FKey)); // 读出的 WinWord 的路径就显示出来了。
Reg.CreateKey(FMyPath); // 创建我们的主键
Reg.OpenKey(FMyPath, True); // 进入我们自己的主键中
Reg.DeleteKey('要删除的主键值');
finally
Reg.Free; // 用 Try..Finally 结构确保 REG 变量能够释放。
end;
end;
end.

这个是我从别的地方摘抄的,呵呵,,,希望对你有所帮助
 
顶部