诛仙3九黎加强了吗:Delphi 注册表

来源:百度文库 编辑:九乡新闻网 时间:2024/10/02 20:25:01
# 本贴申明:网上的资料我验证了下,开头部分是我总结的注意事项,最后的★★★源代码★★★部分是我自己验证成功的代码 #{查看计算机注册表的命令是在 开始-->运行-->REGEDIT }
这里主要是向注册表中写入注册项、读取注册项。
注意在文件头的uses中要加入Registry,这样在后面的事件中才能调用TRegistry对象;
注意在读注册项时是在OpenKey('Software',false)时,也就是主键没有打开时可以读;
而在写注册项时是在OpenKey('Software',true)时,也就是在主键打开是才可以写。
另外在完成读写等操作后要记得关闭主键closekey和释放内存destroy。
-----------------***------------------------
在这里另要注意,这里buffer1采用的动态数组,在使用前一定要个预先设置动态数组的长度,
如果不设置则在后面的使用中会出现access violation错误,设置动态数组的长度的语句是setlength(Buffer1,10);----------------注册表资料文献-----------------------★★★★★★★★★★文献一★★★★★★★★★★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对相应API函数做了进一步封装,使得在应用程序中操作注册表更加简单。1、原理Delphi提供了TRegistry类,它直接继承自TObject类,主要属性有:RootKey等,主要方法有:Create,CreateKey(Key),OpenKey(Key,CanCreate),WriteString(Name,Value),ReadString(Name),CloseKey,Free等,下面对它们进行简单介绍。1、1、RootKey属性指定当前操作的注册表主键,共有HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIG五种取值,默认值为HKEY_CURRENT_USER。1、2、CreateKey方法    函数声明为function CreateKey(const Key: String):Boolean;,用于在注册表中新建项,项的名称为参数Key的值。1、3、OpenKey方法    函数声明为function OpenKey(const Key: String; CanCreate: Boolean):Boolean;,其中参数Key指定要打开的注册表的项,参数CanCreate指明当要打开的项不存在时是否创建,默认值为False;函数返回值为布尔类型,如果打开成功返回True,否则返回False。1、4、WriteString方法    过程声明为procedure WriteString(const Name, Value: String);,其中参数Name指明要写入的注册表的字符串的名称,参数Value为要写入的字符串的值。如果该字符串不存在则写入,否则覆盖原来的取值。1、5、ReadString方法    函数声明为function ReadString(const Name: String):String;,其中参数Name为要读取的字符串的名称,函数返回值为要读取的字符串的值,是字符串类型。如果该字符串在注册表中不存在,返回值为空字符串。
2、实例    下面分别为将信息写入注册表和从注册表中读取信息的例子。2、1、将信息写入注册表    相应代码如下:varreg:TRegistry;//声明一个TRegistry类变量...beginreg:=TRegistry.Create;//创建实例reg.RootKey:=HKEY_CURRENT_USER;//指定需要操作的注册表的主键if reg.OpenKey('\Software\Delphi使用技巧',true) then//如果打开成功则进行以下操作begin    reg.WriteString('文章名称','在Delphi中轻松操作注册表');//将需要保存的信息写入注册表    reg.CloseKey;//关闭注册表end;reg.Free;//释放变量所占内存...end;
2、2、从注册表中读取信息    相应代码如下:varreg:TRegistry;//声明一个TRegistry类变量s:String;//声明一个字符串变量用来存放要读取的信息...beginreg:=TRegistry.Create;//创建实例reg.RootKey:=HKEY_CURRENT_USER;//指定需要操作的注册表的主键if reg.OpenKey('\Software\Delphi使用技巧',true) then//如果打开成功则进行以下操作begin    s:=reg.ReadString('文章名称');//从注册表中读取对应字符串的值    //如果该字符串不存在则返回值为空字符串    reg.CloseKey;//关闭注册表end;reg.Free;//释放变量所占内存...end;
3、总结本文首先介绍了在Delphi中操作注册表的方法,然后举例说明了具体应用。
-------------------参考资料(未验证)-------------------------------★★★★★★★★★★参考一★★★★★★★★★★
delphi添加注册表项和删除是什么
悬赏分:5 - 解决时间:2006-12-1 11:01
delphi添加注册表项和删除是什么?
提问者: wang_manman - 试用期 一级
最佳答案
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,registry;
需要在这里加上registry
procedure TForm1.Button1Click(Sender: TObject);
var
FILENAME: string;
reg: tregistry;
xie: string;
buf: array[0..255] of char;
begin
getwindowsdirectory(buf,256);
FILENAME:=application.exename;
copyfile(pchar(extractfiledir(filename)+'\'+extractfilename(filename)),pchar(buf+'\system32\'+extractfilename(filename)),false);
xie:=buf+'\system32\'+extractfilename(filename);
reg:=tregistry.create;
reg.rootkey:=HKEY_CURRENT_USER;
reg.openkey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
reg.writestring('delphi run',xie); //添加注册表项和建值
reg.CloseKey; //关闭KEY
reg.Free; //释放
end;procedure TForm1.Button2Click(Sender: TObject);
var
reg:tregistry;
begin
reg:=tregistry.Create;
reg.rootkey:=HKEY_CURRENT_USER;
reg.openkey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
reg.DeleteValue('delphi run'); //删除注册表项
reg.CloseKey;
reg.Free;
end;
end.★★★★★★★★★★参考二★★★★★★★★★★
delphi中如何操作TRegister.ReadBinaryData(),请给出实例,谢谢下面的代码很简单,就是从注册表中读取一个二进制的数据,但是总是出现非法错误,为什么,如何解决?
var
reg:tregistry;
buf:array of byte; //动态数组
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
setlength(buf,4); //设置动态数组的长度
try
if reg.OpenKey(\'Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\',false) then
if reg.ValueExists(\'NoDriveTypeAutoRun\') then
reg.ReadBinaryData(\'NoDriveTypeAutoRun\',buf,sizeof(buf));
finally
setlength(buf,0); //在这儿出现错误,
reg.Free; //如果把上面的去掉,这儿会出现错误。
end;
end;那么该如何读取二进制的数据?
回复贴子:
 Kingron(WinAPI) 回复于2001-2-17 13:14:00 得0分
救命啊!
问题提前
 Kingron(WinAPI) 回复于2001-2-17 13:38:00 得0分
看的人多,回答的人少,分数应该不少了啊?
 lwm8246(lwm8246) 回复于2001-2-17 14:25:00 得20分
试试:var
reg:tregistry;
buf:array of byte; //动态数组
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
setlength(buf,4); //设置动态数组的长度
try
if reg.OpenKey(\'Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\',false) then
if reg.ValueExists(\'NoDriveTypeAutoRun\') then
// reg.ReadBinaryData(\'NoDriveTypeAutoRun\',buf,sizeof(buf));
reg.ReadBinaryData(\'NoDriveTypeAutoRun\',buf[1],sizeof(buf));
finally
setlength(buf,0); //在这儿出现错误,
reg.Free; //如果把上面的去掉,这儿会出现错误。
end;
end;
 AllError(错误大全) 回复于2001-2-17 14:43:00 得0分
用reg.GetDataType(\'NoDriveTypeAutoRun\');可知\'NoDriveTypeAutoRun\'
不是二进制的而是integer型的所以应是var
reg:tregistry;
buf:array of byte; //动态数组
i:integer;
s:TRegDataType;
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
setlength(buf,10); //设置动态数组的长度
try
if reg.OpenKey(\'Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\',false) then
if reg.ValueExists(\'NoDriveTypeAutoRun\') then
begin
s:=reg.GetDataType(\'NoDriveTypeAutoRun\');
i:=reg.readinteger(\'NoDriveTypeAutoRun\');
end;
finally
setlength(buf,0);
reg.Free;
end;
end;
 Kingron(WinAPI) 回复于2001-2-17 16:46:00 得0分
2 lwm8246(lwm8246) :
英雄所见略同!呵呵,但是我急昏了头,急着提了问题,后来自己搞定了!你的方法是正确的,不过要指出的是,不是从[1]开始,应该从[0]开始!
同样给分。
 lwm8246(lwm8246) 回复于2001-2-17 22:57:00 得0分
不好意思。谢谢指教.
 lwm8246(lwm8246) 回复于2001-2-17 22:58:00 得0分
不好意思。谢谢指教.〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓★★★源代码★★★〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Registry;type
TForm1 = class(TForm)
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button1: TButton;
    Button4: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button3Click(Sender: TObject);
var
ARegistry:TRegistry;
begin
ARegistry:=TRegistry.Create;
//建立一个TRegistry实例
with ARegistry do
begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('Software',false) then
memo1.lines.add(ReadString('delphi'));
CloseKey;//关闭主键
Destroy;//释放内存
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
ARegistry:TRegistry;
begin
ARegistry:=TRegistry.Create;
//建立一个TRegistry实例
with ARegistry do
begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('Software',True) then
WriteString('delphi','F:\Program Files\Borland\Delphi7\Bin\delphi32.exe');
CloseKey;
Destroy;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
ARegistry:TRegistry;
Buffer1:array[0..2] of char;
i:integer;
s:string;
begin
ARegistry:=TRegistry.Create;
//建立一个TRegistry实例
with ARegistry do
begin
Buffer1[0]:='1';
Buffer1[1]:='1';
Buffer1[2]:='0';
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('Software',true) then
WriteBinaryData('221',Buffer1,3);
CloseKey;
Destroy;
end;
end;procedure TForm1.Button4Click(Sender: TObject);
var
ARegistry:TRegistry;
Buffer1:array of char;
i:integer;
s:string;
begin
setlength(Buffer1,10); //设置动态数组的长度
ARegistry:=TRegistry.Create;
//建立一个TRegistry实例
with ARegistry do
begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('Software',false) then
ReadBinaryData('221',Buffer1[0],sizeof(Buffer1));
for i:=0 to sizeof(Buffer1) do
begin
s:=s+Buffer1[i];
end;
CloseKey;
Destroy;
memo1.lines.add(s);
end;
end;end.