请问如何在注册表中读、写二进制值???(100分)

  • 主题发起人 主题发起人 至尊王
  • 开始时间 开始时间

至尊王

Unregistered / Unconfirmed
GUEST, unregistred user!
如题!最好写出函数方式,如:
function readhex(Hkey,subk,keyname:string):返回数据
function writehex(Hkey,subk,keyname:string,value:类型):boolean;
 
http://www.csdn.net/Develop/article/14%5C14255.shtm

关于读写注册表二进制数据的问题

在Delphi的帮助文件中得到了关于注册表二进制数据的读写函数声明,但是帮助文件中并没有给出例子.现在我给出例程.

1.读取二进制数据
function ReadBinaryData(const Name: String; var Buffer; BufSize: Integer): Integer;
从当前键值返回一个二进制数据.如果成功则返回所需数据,所需数据保存在buffer中,而返回的integer值表示返回数据的大小(byte).


2.存储二进制数据
procedure WriteBinaryData(const Name: String; var Buffer; BufSize: Integer);
存储一个二进制数据到指定的键值.

例程:
procedure TForm1.Button1Click(Sender: TObject);
var
reg:TRegistry; {声明Regstry对象}
typ:TRegDataType; {注册表数据类型.常用的有字符串类型(rdString)、数值类型(rdInteger)、二进制类型(rdBinary)}
str:string; {用于显示操作信息}
i:integer; {注册表的数据大小,以字节为单位}
vv:integer; {注册表的数据内容}
begin
reg:=TRegistry.Create; {创建注册表对象}
reg.RootKey :=HKEY_LOCAL_MACHINE; {设置根键}
reg.OpenKey ('MYSOFT',TRUE); {打开主键}
typ:=reg.GetDataType('ccc'); {得到所需数据的类型}
i:=reg.GetDataSize('ccc'); {得到所需数据的大小}
case typ of {根据数据类型显示提示信息}
rdstring:
str:='This is String Type';
rdInteger:
str:='This is Integer Type';
rdBinary:
str:='This is Binary Type';
else
str:='This is Unknown Type';
end;
memo1.Lines.Add(str);
memo1.lines.Add(inttostr(i)); {提示信息结束}
reg.ReadBinaryData('ccc',vv,i); {读取数据的内容,函数返回数据内容的大小[本例中未写出返回值]}
memo1.Lines.add(inttostr(vv));
vv:=1; {设定数据内容vv=1}
reg.WriteBinaryData('ccc',vv,i); {把数据内容写入注册表中}
reg.CloseKey; {关闭主键}
reg.Free; {释放注册表对象}
end;
 
yzhshi兄说了写入常量数据或者定长数组的二进制数据,不过如果是动态数据就麻烦点,
不明白的是关于这个问题在网上的资料还不多,我做了一个例子:

implementation
uses registry;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var bitmap:TBitmap;
bitmapstream:TMemoryStream;
reg:TRegistry;
p:PByte;
begin
bitmap:=TBitmap.Create;
bitmapstream:=TMemoryStream.Create;
reg:=TRegistry.Create;
try
bitmap.Assign(Image1.Picture.Graphic);
bitmap.SaveToStream(bitmapstream);
bitmapstream.Seek(0,0);
if bitmapstream.Size>0 then
begin
reg.RootKey:=HKEY_CURRENT_USER;
if reg.OpenKey('software/aizb',True) then
begin
GetMem(p,bitmapstream.Size);
try
bitmapstream.Read(p^,bitmapstream.Size);
Reg.WriteBinaryData('bitmap',p^,bitmapstream.Size);
finally
FreeMem(p);
end;
end;
end;
finally
bitmap.Free;
bitmapstream.free;
reg.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var bitmap:TBitmap;
bitmapstream:TMemoryStream;
reg:TRegistry;
p:PByte;
DataInfo:TRegDataInfo;
begin
bitmap:=TBitmap.Create;
bitmapstream:=TMemoryStream.Create;
reg:=TRegistry.Create;
try
bitmap.Assign(Image1.Picture.Graphic);
bitmap.SaveToStream(bitmapstream);
bitmapstream.Seek(0,0);
if bitmapstream.Size>0 then
begin
reg.RootKey:=HKEY_CURRENT_USER;
if reg.OpenKey('software/aizb',True) then
begin
Reg.GetDataInfo('bitmap',DataInfo);
GetMem(p,DataInfo.DataSize);
Reg.ReadBinaryData('bitmap',p^,DataInfo.DataSize);
bitmapstream.Clear;
bitmapstream.Write(p^,DataInfo.DataSize);
bitmapstream.Seek(0,0);
bitmap.LoadFromStream(bitmapstream);
Image2.Picture.Assign(bitmap);
end;
end;
finally
bitmap.Free;
bitmapstream.free;
reg.Free;
end;
end;

我的主页上有完整的源程序下载:
www.aidelphi.com
 
我要的是一个可以调用的函数!如:
readDate(HKEY_CURRENT_USER,'mysofthex')返回 04000000;
而writeDate(HKEY_CURRENT_USER,'mysofthex','04000000')成功返回True!
 
用 TRegistry 中的ReadBinaryData 和 WriteBinaryData 函数


 
function WriteREGbin(RootKeys:hkey;keypath,keyvalue:string; var Buffer;Bufsize:integer):boolean;
var
reg:TRegistry;
begin
reg:=TRegistry.Create;
reg.RootKey:=RootKeys;
Result:=false;
try
try

if reg.KeyExists(keypath) then begin
if reg.OpenKey(keypath,false) then
reg.WriteBinaryData(keyvalue,Buffer,Bufsize);
end
else begin
reg.CreateKey(keypath);
if reg.OpenKey(keypath,false) then
reg.WriteBinaryData(keyvalue,Buffer,Bufsize);
end;

Result:=true;
reg.Closekey;
finally
reg.Free;
end;
except
end;
end;
//************* 写注册表二进制格式 过程 **************

function readREGbin(RootKeys:hkey;keypath,keyvalue:string; var Buffer;Bufsize,Default:integer):integer;
var
reg:TRegistry;
begin
reg:=TRegistry.Create;
reg.RootKey:=RootKeys;
try
try
if reg.OpenKey(keypath,false) then begin
if reg.ValueExists(keyvalue) then
Result:=reg.ReadBinaryData(keyvalue,Buffer,Bufsize)
else
Result:= Default;
end;
reg.Closekey;
finally
reg.Free;
end;
except
end;
end;
//************* 读注册表二进制格式 过程 **************
 
兄弟,代码都贴到这份上,你都不想自己去改改,改成你自己想要的,还想要别人给你改好,我劝你还是不要学Delphi了,我想你永远学不会了!
 
谢谢各位,但我如何调用 ledo 的函数?
 
马上发红包!
 
我也来以下!
 
后退
顶部