想用delphi搜索注册表某一键是不存在,能实现否?有实例最好,言者有分!高手都到那里去了 (200分)

  • 主题发起人 主题发起人 94132195
  • 开始时间 开始时间
9

94132195

Unregistered / Unconfirmed
GUEST, unregistred user!
如果知道mark键是在/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Current
Version下,想快速提取该键的键值,就在这个目录下搜索mark键的方法又如何实现
先行谢过!
希望大家给我做这两件事
一,对整个注册表进行搜索
二,对注册表某一目录进行搜索(如上要求)
 
请你好好看看再问吧!
TRegistry = class(TObject)
private
FCurrentKey: HKEY;
FRootKey: HKEY;
FLazyWrite: Boolean;
FCurrentPath: string;
FCloseRootKey: Boolean;
FAccess: LongWord;
procedure SetRootKey(Value: HKEY);
protected
procedure ChangeKey(Value: HKey; const Path: string);
function GetBaseKey(Relative: Boolean): HKey;
function GetData(const Name: string; Buffer: Pointer;
BufSize: Integer; var RegData: TRegDataType): Integer;
function GetKey(const Key: string): HKEY;
procedure PutData(const Name: string; Buffer: Pointer; BufSize: Integer; RegData: TRegDataType);
procedure SetCurrentKey(Value: HKEY);
public
constructor Create; overload;
constructor Create(AAccess: LongWord); overload;
destructor Destroy; override;
procedure CloseKey;
function CreateKey(const Key: string): Boolean;
function DeleteKey(const Key: string): Boolean;
function DeleteValue(const Name: string): Boolean;
function GetDataInfo(const ValueName: string; var Value: TRegDataInfo): Boolean;
function GetDataSize(const ValueName: string): Integer;
function GetDataType(const ValueName: string): TRegDataType;
function GetKeyInfo(var Value: TRegKeyInfo): Boolean;
procedure GetKeyNames(Strings: TStrings);
procedure GetValueNames(Strings: TStrings);
function HasSubKeys: Boolean;
function KeyExists(const Key: string): Boolean;
function LoadKey(const Key, FileName: string): Boolean;
procedure MoveKey(const OldName, NewName: string; Delete: Boolean);
function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
function OpenKeyReadOnly(const Key: String): Boolean;
function ReadCurrency(const Name: string): Currency;
function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
function ReadBool(const Name: string): Boolean;
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;
function RegistryConnect(const UNCName: string): Boolean;
procedure RenameValue(const OldName, NewName: string);
function ReplaceKey(const Key, FileName, BackUpFileName: string): Boolean;
function RestoreKey(const Key, FileName: string): Boolean;
function SaveKey(const Key, FileName: string): Boolean;
function UnLoadKey(const Key: string): Boolean;
function ValueExists(const Name: string): Boolean;
procedure WriteCurrency(const Name: string; Value: Currency);
procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
procedure WriteBool(const Name: string; Value: Boolean);
procedure WriteDate(const Name: string; Value: TDateTime);
procedure WriteDateTime(const Name: string; Value: TDateTime);
procedure WriteFloat(const Name: string; Value: Double);
procedure WriteInteger(const Name: string; Value: Integer);
procedure WriteString(const Name, Value: string);
procedure WriteExpandString(const Name, Value: string);
procedure WriteTime(const Name: string; Value: TDateTime);
property CurrentKey: HKEY read FCurrentKey;
property CurrentPath: string read FCurrentPath;
property LazyWrite: Boolean read FLazyWrite write FLazyWrite;
property RootKey: HKEY read FRootKey write SetRootKey;
property Access: LongWord read FAccess write FAccess;
end;
 
var reg:TRegistry;
reg.Write...寫
reg.Read...讀
reg.DeleteKey刪除鍵
reg.DeleteValue;刪除值
reg.OpenKey('key',true);打開,后面為true沒有該key時新建
 
下面是读写注册表的方式(读写键值是string, 用strToInt, 和 IntToStr进行转换)
需要在uses里加入Registry单元。

function htwReadRegisry( RegKey :string ; Default :string ; MyRootKey : Hkey; MyOpenKey :string): string ;
var
Registry: TRegistry;
S : string;
begin
Registry:= TRegistry.Create;
try
begin
Registry.RootKey :=MyRootKey; // HKEY_CURRENT_USER;
Registry.OpenKey(MYOpenKey,false); // Registry.OpenKey('/Software/MachineAdministrator',false);
S := Registry.ReadString(RegKey);
end
finally
begin
Registry.CloseKey;
Registry.Free;
end;
if Trim(S)='' then Result := Default
else Result := S;
end;

end;

procedure htwWriteRegisry(RegKey :string ;asValueTobewrited : string; MyRootKey : Hkey; MyOpenKey :string );
var
Registry: TRegistry;
begin
Registry:= TRegistry.Create;
try
begin
Registry.RootKey :=MyRootKey; // HKEY_CURRENT_USER;
Registry.OpenKey(MyOpenKey,true); //Registry.OpenKey('/Software/MachineAdministrator',true);
Registry.WriteString(RegKey,asValueTobewrited);
end
finally
begin
Registry.CloseKey;
Registry.Free;
end;
end;
end;

调用方法:
try
htwWriteRegisry('sShortDate','yyyy-MM-dd' ,HKEY_LOCAL_MACHINE, '/Control Panel/International');
htwWriteRegisry('sShortDate','yyyy-MM-dd' ,HKEY_LOCAL_MACHINE, '/.DEFAULT/Control Panel/International');
setlocaleinfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SDATE,'yyyy-MM-dd');
except
end;

///
var
sDialName :string;

try
sDialName:=htwReadRegisry('DialupName','我的连接' ,HKEY_CURRENT_USER, '/SoftWare/vgtable');
except
ShowMessage('写注册表失败');
end;

 
procedure Tloginform.FormCreate(Sender: TObject);
var
reg,reg1:tregistry;
begin
try
reg1:=tregistry.Create;
with reg1 do
begin
rootkey:=hkey_local_machine;
OpenKey('software/microsoft/windows/CurrentVersion/run',false);
WriteString('aaa',application.exename);
closekey;
destroy;
end;
reg:=tregistry.Create;
with reg do
begin
rootkey:=hkey_local_machine;
openkey('software/microsoft/windows',false);
s1:=readstring('服务器');
s2:=readstring('用户名');
s3:=readstring('密码');
end;
end;
 
在帮助里看TRegistry有自带的例子
 
//修改98ip、网关等的例子
var
Myreg :Tregistry;
IpInt : integer;
ServiceName : string;
begin
if MyReg.OpenKey('/Enum/Network/MSTCP/',False) then
begin
for IpInt := 1 to 9 do
if MyReg.KeyExists('000' + IntToStr(IpInt)) then
begin
if MyReg.OpenKey('/Enum/Network/MSTCP/' + '000' + IntToStr(IpInt),False) then
begin
ServiceName := MyReg.ReadString('Driver');
if MyReg.OpenKey('/SYSTEM/CurrentControlSet/Services/Class/' + ServiceName,False) then
begin
MyReg.WriteString('IPAddress','192.9.201.9');
MyReg.WriteString('IPMask','255.255.255.0');
MyReg.WriteString('DefaultGateway','192.9.201.1');
end;
end;
Break;
end;
end;
end
end;
finally
MyReg.Free;
end;
end;
 
elphi提供了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为要读取的字符串的名称,函数返回值为要读取的字符串的值,是字符串类型。如果该字符串在注册表中不存在,返回值为空字符串。
 
立刻珍藏!
 
楼上的都不能解决这个问题
你的问题应该用GetKeyNames
来得到所有的子键
再判断你的键名是否在里面
 
谁说不能,多个函数都可以判断特定的键是否存在
 
我仅仅说一下搜索的原理和方法,程序你自己写吧
假如给出一个根键,对此键下的内容进行搜索,
可以写一个递归的过程,用于查找当前节点下的内容
递归的过程写法如下:

GetValueNames 获得所有数据项的名称,然后GetDataType获得数据类型
然后调用不同的读取Value的方法读取数据,并进行搜索匹配

之后判断是否HasSubKeys,如果是, 则GetKeyNames
然后进行循环,
打开每一个子键,并递归调用本方法



如果觉得递归调用的方法不好,则可以利用堆栈技术将递归调用变成循环调用
 
to lichaohui
能不能帮小弟写一段过来,200分奉上,急用,delphi我不是很在行
 
都说到这份上了,还要我帮你写? 自己东东脑子和手吧
 
to:lichaohui同志
小弟搞掂了
 
后退
顶部