急!Delphi如何实现将“任意字符串”写入注册表reg_binary类型的数据中?给出详细解答的送100分!谢谢!

longerc62 2008-02-14 10:22:55
例如: 将一个POP3 Server的的值为 pop.126.com
需要使用程序实现,将 pop.126.com 写进注册表,变成下面的值:

"POP3 Server"=hex:70,00,6f,00,70,00,2e,00,31,00,32,00,36,00,2e,00,63,00,6f,00,\
6d,00,00,00

注册表种查看如下:

这里比较特殊的地方在于: 可以实现 将pop.126.com各个字母都转换为二进制值,例如 p转换为 "70",o转换为"6f",等。但是后面还要添加每个字符转后后还要添加 00,最后还要添加 两个 "00",我的部分程序如下:

var
i,len:integer;
Buf:array of byte;
R:TRegistry;
Str:String;
begin
len:=length(Str);
SetLength(Buf,len);
for i:=0 to len-1 do
begin
s:= Str[i+1];
Buf[i]:=ord(Str[i+1]);
end;
R:=TRegistry.Create;
R.RootKey := HKEY_CURRENT_USER;
Try
if R.OpenKey('Software\test',True) then
R.WriteBinaryData('Display Name',Buf,Sizeof(Buf));
finally
R.CloseKey;
R.Free;

但是结果却不对,请各位高手帮忙看看,如何实现,谢谢!
...全文
334 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jfjy_0 2008-02-18
  • 打赏
  • 举报
回复
学习了!
老姜是厉害 呵呵
longerc62 2008-02-16
  • 打赏
  • 举报
回复
马上要结贴了,分数会送给大家的,真诚感谢各位的帮助!谢谢!
longerc62 2008-02-16
  • 打赏
  • 举报
回复
各位高手,

我写上面的程序是为了开发一个 配置Microsoft Outlook 2003和Outlook Express的程序,想通过写注册表的方式来实现,

请教各位,完全通过写注册表是否能够实现呢??

有什么需要注意的么?有没有哪位大哥有一些经验可以介绍给我,谢谢!不胜感激!
wxsan 2008-02-16
  • 打赏
  • 举报
回复
僵哥 详细的回答精神,很佩服啊!
僵哥 2008-02-15
  • 打赏
  • 举报
回复
uses
Registry;
procedure TForm2.FormCreate(Sender: TObject);
var
i,len:integer;
R:TRegistry;
Str:WideString;//使用Unicode
begin
Str := 'pop.126.com';
// for i:=0 to len-1 do
// begin
// Buf[i]:=ord(Str[i+1]);
// end;
R:=TRegistry.Create;
Try
R.RootKey := HKEY_CURRENT_USER;
if R.OpenKey('Software\test',True) then
try
R.WriteBinaryData('Display Name',Str[1],(Length(Str)+1(*加上串结束符$0000*))*sizeof(WideChar(*按宽字符计算字节数*)));
finally
R.CloseKey;
end;
Finally
R.Free;
End;
end;
僵哥 2008-02-15
  • 打赏
  • 举报
回复
uses
Registry;
procedure TForm2.FormCreate(Sender: TObject);
var
i,len:integer;
Buf:array of byte;
R:TRegistry;
Str:WideString;
begin
Str := 'pop.126.com';
len:=length(Str);
SetLength(Buf,(len+1)*sizeof(WideChar));
fillchar( Buf[0],Length(buf),0);
// for i:=0 to len-1 do
// begin
// Buf[i]:=ord(Str[i+1]);
// end;
Move( Byte(Str[1]),Buf[0],len*sizeof(WideChar));
R:=TRegistry.Create;
Try
R.RootKey := HKEY_CURRENT_USER;
if R.OpenKey('Software\test',True) then
try
R.WriteBinaryData('Display Name',Buf[0],Length(Buf));
finally
R.CloseKey;
end;
Finally
R.Free;
End;
end;
HsWong 2008-02-15
  • 打赏
  • 举报
回复
先进行格式转换,即把
pop.126.com
转换成:
hex:70,00,6f,00,70,00,2e,00,31,00,32,00,36,00,2e,00,63,00,6f,00,6d,00,00,00


function StrToMyHex(const S:string):string;
var
i:Integer;
len:Integer;
begin
len:=Length(S);
if len>0 then
begin
Result:=Format('hex:%s,00',[IntToHex(Ord(S[1]),2)]);
for i:=2 to len do
begin
Result:=Format('%s,%s,00',[Result,IntToHex(Ord(S[i]),2)]);
end;
Result:=Result+',00,00';
end
else
Result:='';
end;


僵哥 2008-02-15
  • 打赏
  • 举报
回复
WideString即宽字符串,亦即Unicode串。String,即AnsiString,是一个ANSI串。
longerc62 2008-02-15
  • 打赏
  • 举报
回复
非常感谢 "僵哥"!真是高手啊!佩服!分应该都是你的啦!真想和你交个朋友啊!我的MSN是longerc62@hotmail.com!

还想请教一下:widestring 和String有什么区别啊?



String:
"Display Name"=hex:6c,6f,72,65,6e,00,00,00,04,06,46,00

WideString:
"Display Name"=hex:6c,00,6f,00,72,00,65,00,6e,00,00,00


Str:WideString;//可以正确实现

但是Str:String;
运行的结果却不对啊?

5,531

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧