给你一个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可以为绝对的或相对的名字,绝对名用反斜杠“\”开头,相对名是新建一个当前键的子键。新建没有值。
成功返回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方法
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,将打开本地计算机。
●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可以为绝对的或相对的名字,绝对名用反斜杠“\”开头,相对名是新建一个当前键的子键。新建没有值。
成功返回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方法
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,将打开本地计算机。
var
Reg: TRegIniFile;
begin
if Length(NameofKey.Text) or Length(ValueforKey.Text) <=0 then
Showmessage('Either the key name or value is missing.')
else begin
Reg:=TRegIniFile.Create('MyApp');
try
Reg.RootKey:=HKey_Local_Machine; // Section to look for within the registry
if not Reg.OpenKey(NameofKey.Text,False) then
if MessageDlg('The specified key does not exist, create it?' ,Mtinformation,[mbYes,mbNo],0)=mryes then
begin
Reg.CreateKey(NameofKey.Text);
if not Reg.OpenKey(NameofKey.Text,False) then
ShowMessage('Error in Opening Created Key')
else
Reg.WriteString('Main Section','Value1',ValueForKey.Text);
end
else
Reg.WriteString('Main Section','Value1',ValueForKey.Text);
finally Reg.Free;
end;
end;
end;
通过对注册表进行修改,可以删除一种文件名后缀与某个应用程序相关联
程序例如下:
procedure deregisterFileType(ft: String);
//ft:将要删除文件关联的后缀,如.tst
var
myreg:TRegistry;
key: String;
begin
myreg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
myReg.OpenKey(ft, False);
key:=MyReg.ReadString('');
MyReg.CloseKey;
myReg.DeleteKey(ft);
myReg.DeleteKey(key);
myReg.Free;
end;
调用例子:
Example:
deregisterFileType('.tst');
通过对注册表进行修改,可以删除资源管理器上下文件菜单中的新建子菜单中的命令
程序例如下:procedure FileTDelNew(ft: String);//fp:文件后缀键值,如.tst
var
myReg:TRegistry;
begin
myReg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
if not myReg.KeyExists(ft) then
begin
MyReg.Free;
Exit;
end;
MyReg.OpenKey(ft, true);
if MyReg.KeyExists('ShellNew') then
MyReg.DeleteKey('ShellNew');
MyReg.CloseKey;
MyReg.Free;
end;
调用例子:
Example:
FileTDelNew('.tst');
原理说明:
将后缀键的下面的子键ShellNew删除即可。
通过对注册表进行修改,可以删除资源管理器上下文件菜单中对某类文件的处理命令
程序例如下:
procedure FileTDelAction(key, name: String);
//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile
//name:命令名称
var
myReg: TRegistry;
begin
myReg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT; //如果给出的是一个文件后缀,则转换成对应的描述键值
//在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的{ if key[1] = '.' then
key:= copy(key,2,maxint)+'_auto_file';} if key[1] = '.' then
begin
if myReg.KeyExists(key) then //首先看注册表中是否有此键,有则取出
begin
myReg.OpenKey(key, false);
key:=myReg.ReadString ('');
end
else
key:= copy(key,2,maxint)+'_auto_file';
end; if key[Length(key)-1] <> '\' then
key:=key+'\';
myReg.OpenKey('\'+key+'shell\', true);
if myReg.KeyExists(name) then
myReg.DeleteKey(name);
myReg.CloseKey;
myReg.Free;
end;
调用例子:
Example:
FileTDelAction('test','edit');原理说明:
将注册表中对应的键值删除就可以了。
通过对注册表进行修改,可以实现一种文件名后缀与某个应用程序相关联
程序例如下:
procedure registerfiletype(ft,key,desc,icon,prg:string);
//ft:文件名后缀,如可以为'.tst'或'afile.tst'
//key:在注册表中的键值,要唯一
//desc:关联程序的描述
//icon:缺省的程序图标,如Application.ExeName+',1',可以缺省
//prg:对应的应用程序
var myreg : treginifile;
ct : integer;
begin // 取文件的后缀
ct := pos('.',ft);
while ct > 0 do begin
delete(ft,ct,1);
ct := pos('.',ft);
end;
if (ft = '') or (prg = '') then exit; //判断后缀及应用程序是否有效
ft := '.'+ft;
myreg := treginifile.create('');
try
myreg.rootkey := hkey_classes_root; // 根应该为HKEY_CLASSES_ROOT
if key = '' then key := copy(ft,2,maxint)+'_auto_file';
// 如果没给出键值,则自动创建一个
myreg.writestring(ft,'',key); // 写入描述的键值
myreg.writestring(key,'',desc); // 写入描述
if icon <> '' then
myreg.writestring(key+'\DefaultIcon','',icon);
// 写入缺省图标
myreg.writestring(key+'\shell\open\command','',prg+' "%1"');
//写入相关联的应用程序
finally
myreg.free;
end;
end;
调用例子:
Example:
registerFileType('.tst',
'testfile',
'测试关联文件',
Application.ExeName+',1',
Application.ExeName);
原理说明:
程序关联的键值放在注册表根为HKEY_CLASSES_ROOT下面。实现文件关联要写入两
个键值:后缀键值和描述键值(可用术语用的不对)
如实现将.tst与程序tstfile.exe相关联
其中后缀键值形为: .tst myprogram
key值为文件后缀,取值为对于key的一个描述
描述键值形为: myprogram 文件描述
其中还有相应的子键,如缺省的程序图标,形为:
myprogram\DefaultIcon '', 'tstfile.exe,1'
打开命令,形为:
myprogram\shell\open\command '', 'tstfile.exe "%1"'
写入完这两个键值后就可以实现文件与应用程序相关联了。
通过对注册表进行修改,可以在资源管理器上下文件菜单中的新建子菜单中增加新的命令
程序例如下:
type
TFileNewType = (ftNullFile, ftFileName, ftCommand); procedure FileTAddNew(ft, param: String; newType: TFileNewType);
//fp:文件后缀键值,如.tst
//param:传递参数
//newType:新建的类型,有空文件, 文件名, 命令
var
myReg:TRegistry;
begin
myReg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
if not myReg.KeyExists(ft) then
begin
MyReg.Free;
Exit;
end;
myReg.OpenKey(ft+'\ShellNew', true);
case NewType of
ftNullFile : MyReg.WriteString('NullFile', '');
ftFileName : MyReg.WriteString('FileName', param);
ftCommand : MyReg.WriteString('Command', param);
end;
MyReg.CloseKey;
MyReg.Free;
end;
调用例子:
Example:
FileTAddNew('.tst','', ftNullFile);
原理说明:
在后缀键的下面增加子键ShellNew。如在上下文菜单中增加新建.tst文件的命令
在.tst键值下面增加子键 .tst\ShellNew 'NullFile', ''
通过对注册表进行修改,可以在资源管理器上下文菜单中增加对某类文件的处理命令
程序例如下:procedure FileTAddAction(key, name, display, action: String);
//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile
//name:命令名称
//display:在上下文件菜单上显示的提示信息
//action:对应的命令
var
myReg:TRegistry;
begin
myReg:=Tregistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
if name='' then name:=display;
//如果给出的是一个文件后缀,则转换成对应的描述键值
//在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的{ if key[1] = '.' then
key:= copy(key,2,maxint)+'_auto_file';} if key[1] = '.' then
begin
if myReg.KeyExists(key) then //首先看注册表中是否有此键,有则取出
begin
myReg.OpenKey(key, false);
key:=myReg.ReadString ('');
end
else
key:= copy(key,2,maxint)+'_auto_file';
end; if key[Length(key)-1] <> '\' then
key:=key+'\';
if name[Length(name)-1] <> '\' then
name:=name+'\'; myReg.OpenKey(key+'Shell\'+name, true);
myReg.WriteString('', display);
MyReg.CloseKey;
MyReg.OpenKey(key+'Shell\'+name+'Command\', true);
MyReg.WriteString('', action);
myReg.Free;
end;
调用例子:
Example:
FileTAddAction('testfile','edit','Edit',Application.ExeName+'-e "%1"');原理说明:
如.txt对应的描述键值为testfile
则在testfile的键值下面,增加动作子键
如: testfile\shell\ '', Edit
testfile\shell\Command\ '', 'c:\testfile -e "%1"'
begin
with TRegistry.Create do try
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('Software\ODBC\ODBCINST.INI', False);
GetKeyNames(Memo1.Lines);
finally
Free;
end;
end;