例如: 将一个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;但是结果却不对,请各位高手帮忙看看,如何实现,谢谢!

解决方案 »

  1.   

    先进行格式转换,即把
    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;
      

  2.   

    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;
      

  3.   

    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;
      

  4.   

    非常感谢  "僵哥"!真是高手啊!佩服!分应该都是你的啦!真想和你交个朋友啊!我的MSN是[email protected]!还想请教一下:widestring 和String有什么区别啊?String:
    "Display Name"=hex:6c,6f,72,65,6e,00,00,00,04,06,46,00WideString:
    "Display Name"=hex:6c,00,6f,00,72,00,65,00,6e,00,00,00
    Str:WideString;//可以正确实现但是Str:String;
    运行的结果却不对啊?
      

  5.   

    WideString即宽字符串,亦即Unicode串。String,即AnsiString,是一个ANSI串。
      

  6.   

    各位高手,我写上面的程序是为了开发一个 配置Microsoft Outlook 2003和Outlook Express的程序,想通过写注册表的方式来实现,请教各位,完全通过写注册表是否能够实现呢??有什么需要注意的么?有没有哪位大哥有一些经验可以介绍给我,谢谢!不胜感激!