ccidnet????

出版日期:1999-09-06 总期号:855 本年期号:65

本期导读
要闻综合
电脑工作室
市场
硬件
软件
infotimes
在delphi程序中操作注册表

王发军

  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联机帮助文件。

  以上程序在pwin 98+delphi 3.0下调试通过。