这两个函数是实现以2进制形式往注册表中写字符串,现在程序是正确的(大写的标示符都是常量不用管)。我有一点不明白。在函数WriteSn中,如果我不声明ary,并去掉与之相关的语句,把here1的内容换为here2的内容,那么往注册表中写操作就没有成功,得到的是乱码。而现在就是成功的。我认为声明ary是多余的。谁能帮我指点一下呢,谢谢。//往注册表中写p值
function WriteSn(p:PChar):boolean;
var
  reg:TRegistry;
  ary:array[0..KEY_LEN-1] of char;
begin
  reg := TRegistry.Create;
  reg.RootKey := ROOT_KEY;
  reg.OpenKey( KEY_PATH, true );
  ZeroMemory( @ary, KEY_LEN );
  StrCopy( ary, p );
  reg.WriteBinaryData( KEY_NAME, ary, KEY_LEN ); //<-----here1  {reg.WriteBinaryData(KEY_NAME, p, KEY_LEN)} //<------here2  reg.CloseKey();
  reg.Free;
end;//调用WriteSn往注册表中写Edit1.text的内容
procedure TForm1.Button1Click(Sender: TObject);
var
  ary:array[0..KEY_LEN-1] of char;
begin
  StrPCopy( ary, edit1.Text );
  WriteSn( ary );
end;

解决方案 »

  1.   

    如果不用ary,则传入参数应该为WriteSn(PChar(edit1.text));或WriteSn(@edit1.text[1])
      

  2.   

    如果不用ary,可以这样:1、定义类型:Tary=array[0..KEY_LEN-1] of char;
    2、修改函数:function WriteSn(var ary: Tary):boolean;   使用:
        reg.WriteBinaryData( KEY_NAME, ary, KEY_LEN ); //<-----here13、发调函数:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ary:Tary;
    begin
      StrPCopy( ary, edit1.Text );
      WriteSn( ary );
    end;
      

  3.   

    谢谢各位。
    我的理解是PChar传的是地址,而调用WriteSn时的p是分配了空间的,那么在WriteSn函数中就可以那样用了,而不需要ary了。但不知为什么不行,哪位高手可以讲讲原理吗,先睡觉,明天结贴。
      

  4.   

    如果你传下个String类型的不是更方便吗?
    还有就是传个array类型的也可以呀。
      

  5.   

    用PChar是因为,最后函数要生成.dll文件,要供其它语言函数调用