TRegistry_delphi中对注册表的操作

 
 
TRegistry
delphi
注册表的 操作
 
 
 
 
 
 
 
     [DELPHI] 关于处理注册表
uses Registry;
var reg:Tregistry;
reg:=Tregistry.create;
reg.rootkey:='HKey_Current_User';
reg.openkey('Control Panel/Desktop',false);
reg.WriteString('Title Wallpaper','0');
reg.writeString('Wallpaper',filelistbox1.filename);
reg.closereg;
reg.free;
 
 
 
 
 
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
   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 下,有三个字符串值 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
   if OpenKey( ′Software′,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′,True) then
   WriteString(′delphi′,′C:Files.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下的数值名称的方法来进行。
  6.判断数值名称存在、数值名称改名。
  valueExists用于判断数值名称是否存在:
  function valueExists(const Name: string): Boolean;
  返回值为True表示数值名称存在。
  Renamevalue用于数值名称改名:
  procedure Renamevalue(const OldName, NewName: string);
  以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。
     delphi tregistry 注册表类方法详解
●getdatainfo 方法
function getdatainfo(const valuename:string;var value:tregdatainfo):boolean;
tregdatatype=(rdunknown,rdstring,rdexpandstring,rdexpandstring,rdinterger,rdbinary);
tregdatainfo=record
    regdata:tregdatatype; 数据类型
     datasize:integer; 数据大小
end
valuename:
和当前键关联的数据值名称

value
返回数据的信息,如为 rdstring rdexpandstring 类型,则数据大小包括字符串未尾的空结束字符。如果成功返回 true ,失败返回 false ,并且 value 的值为 zeros

rdexpandstring
是一个包含环境变量的字符串 ; path

●createkey 方法
function createkey(const key:string):boolena;
  新建一个名为 key 的键, key 可以为绝对的或相对的名字,绝对名用反斜杠 “/u8221” 开头,相对名是新建一个当前键的子键。新建没有值。成功返回 true ,否则返回 false, 如果该键已存在将不产生效果。

●deletekey
方法
function deletekey(const key:string):boolean;
  删除一个键及相关联的数据,在 win95 中子键也将被删除, nt 中子键必须一个个删除。

●deletevalue
方法
function deletevalue (const name:string):boolean;
  删除当前键中指定的一个数据值 name

●getdatasize
方法
function getdatasize(const valuename:string):integer;
  返回当前键中一个指定数值 valuename 数据的大小。
●getdatatype
方法
function getdatatype(const valuename;string):tregdatatype;
  返回当前键中一个指定数值 valuename 数据的类型。

●getkeyinfo
方法
function getkeyinfo(var value:tregkeyinfo):boolean;
  返回当前键的信息,在于 value 中。
tregkeyinfo=record
  maxsubkeylen:integer; 子键名的最长值(字节)
  numvalues:integer; 键值的数量
  maxvaluelen; 最长的键值名的长度
  filetime:tfiletime; 最后一次更改的时间
end;

●getkeynames
方法
procedure getkeynames(strings:tsrtings);
  返回当前键所有子键的名子列表串。

●getvaluenames
procedure getvaluenames(strings:tstrings);
  返回当前键所有键值名的列表串。

●hassubkeys
方法
(AdWords)function hassubkeys:boolean;
  判断当前键是否有子键,有返回 true ,否则返回 false

●keyexists
方法
function keyexists(const key:string):boolean;
  判断指定的键是否存在。

●loadkey
方法
function loadkey(const key,filenmae:string):boolean;
 在根键下新建
 从一个文件中加载注册信息到子键中,文件注册信息中包含数据值名、子键和数据。
  loadkey 使创建一个键单一化,子键,键值和数据在一人操作中完成,所有这些称为一组,和单独地创建它们不同应用程序可以在一个文件中读取一组数据,这在用户运行中重新设置有特别的用处。
  key 为要创建子键的名子
  filename :为文件的位置,所指定的文件必须为以前用 savekey 函数或 regsavekey api 函数所建立的,文件名不能包括扩展名。

●openkey
方法
function openkey(const key:string;cancreate:boolean):boolean;
  使用该函数可以指定一个键作为当前键,如果键为 nil ,则当前键 将设置为根键。
   cancreate 决定是否在指定键不存在时创建该键,该函数创建的键的键值将不确定。如果成功地打开或创建,该函数返回 true

●openkeyreadonly
方法
function openkeyreadonly(const key: string): boolean;
  以只读的方式打开 key 值指定的键。

●closekey
方法
procedure closekey;
  当不再使用一个键时应用该方法关闭该键。

●movekey
方法
procedure movekey(const oldname, newname: string; delete: boolean);
  该方法移动或复制一个键到一个新的位置,并把键的名子改为 newname
  win95/98 下该的子键和数据将被一起移动或复制到新的位置,在 nt 下子键必须用 movekey 明确的移动或自制。

读取数据的方法
function readbinarydata(const name: string; var buffer; bufsize: integer):integer;

function readbool(const name: string): boolean;

function readcurrency(const name: string): currency;

function readdate(const name: string): tdatetime;

function readdatetime(const name: string): tdatetime;

function readfloat(const name: string): double;

function readinteger(const name: string): integer;

function readstring(const name: string): string;

function readtime(const name: string): tdatetime;

  以上方法从当前主键读取相应数据类型的键值的数据,如果类型不匹配将产生一个异常。

●registryconnect
方法
function registryconnect(const uncname: string): boolean;

 与另一台计算机的注册表建立连接,在建立连接前应将 rootkey 属性设为 hkey_users hkey_local_machine
  uncname 是另一台计算机的名子。格式如: /computername
 假如 uncname nil ,将打开本地计算
 
     应用之一:让自己的程序随WIN95/98/NT的启动而运行
  当然,你可以在"启动"程序组中加入程序的快捷方式,但这样做好像不大明智,因为大多数程序在安装时不会这样做,而通过在注册表增加键值,让WIN 95/98/NT在启动时运行自己的程序.如果打开注册表,找到HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run,就会发
  现这个秘密了,原来许多自动运行的程序都在这里.你也可以在这里增加一个键,让你的程序也随着WIN95/98/NT的启动而自己运行,成为WINDOWS下的TSR程序.实现方法如下:
  首先,在Uses中加上Registry单元。然后,写下面代码.
  { 将程序strExeFileName置为自动启动 }
function StartUpMyProgram( strPrompt,strExeFileName : string ) : boolean;
var
  registerTemp : TRegistry;
begin
  registerTemp := TRegistry.Create; //建立一个Registry实例
  with registerTemp do
   begin
   RootKey:=HKEY_LOCAL_MACHINE;//设置根键值为                    HKEY_LOCAL_MACHINE
   //找到Software/Microsoft/Windows/CurrentVersion/Run
   if OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',True) then
   //写入自己程序的快捷方式信息
   begin
   WriteString( strPrompt, strExeFileName );
   result := true;
   end
   else result := false;
   //善后处理
   CloseKey;
   Free;
   end;
  end;
  { 调用StartUpMyProgram,使Delphi随WINDOWS启动而自动运行 }
  procedure TForm1.Button1Click(Sender: TObject);
  begin
   memo1.lines.add('开始');
   if StartUpMyProgram('delphi','C:/Program Files/borland/delphi3/bin/delphi32.exe') then
   memo1.lines.add('成功')
   else
   memo1.lines.add('失败')
  end;


应用之二:实现文件关联


  当MS WORD安装在你的系统中时,它会把.DOC文件与自己关联,当你双击一个DOC文件,就会启动MS WORD,打开你指定的DOC文件.你也可以把一个文件类型与一个程序关联起来,其秘密还是在注册表中.如果打开注册表,找到HKEY_CLASSES_ROOT,就会发现这里已经有很多文件类型。你也可以在这里增加一个键,建立自己的文件关联.

  建立文件关联,一般应有两个步骤:

  (1)根据文件类型的扩展名,指定对应的键名(如doc文件对应的键为doc_auto_file),该键及其子键的值,将定义该类型的文件的类型说明和操作(如打开、编辑)说明。

  (2)在指定的键名下,建立子键,指明文件类型说明和操作对应的程序信息
  例如,我们可以为.DBF文件建立文件关联,其文件类型说明为"xBase数据表",使其打开(Open)文件的操作对应程序C:/Program Files/Borland/DBD/DBD32.EXE.首先,应在注册表的根键HKEY_CLASSES_ROOT下建立一个键,键名为.DBF,默认值为DBF_Auto_File,表示DBF类型文件的关联操作信息记录在键HKEY_CLASSES_ROOT/DBF_Auto_File下;然后,建立键HKEY_CLASSES_ROOT/DBF_Auto_File,并设其默认值为"xBase数据表",表示文件类型说明;再建立键HKEY_CLASSES_ROOT/DBF_Auto_File/Shell/open/command,设置其默认值为C:/Program Files/Borland/DBD/DBD32.EXE %1(其中"%1"为命令行参数),表示打开操作对应的程序信息。
  具体实现如下:
  同样,在Uses中加上Registry单元,然后,写下面代码.
  { 将文件类型strFileExtension与程序strExeFileName相关联,strDiscription为文件类型说明 }
function AssignToProgram( strFileExtension,strDiscription,strExeFileName : string ) : boolean;
  var
  registerTemp : TRegistry;
  begin
  registerTemp := TRegistry.Create; //建立一个Registry实例
  with registerTemp do
     begin
   RootKey:=HKEY_CLASSES_ROOT;//设置根键值为HKEY_CLASSES_ROOT
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值