希望用Pchar实现,不过我写的几个测试程序出现错误

解决方案 »

  1.   

    我想写一个dll供其他程序调用,其中需要传递字符串出来,由于pascal对于string的处理
    方式,我想传递出一个pchar出来,程序如下
    dll中的函数
    function StringTest(out Pstr: Pchar): integer;
    var
      Str: string;
      Chars: array[0..255] of char;
      i: integer;
    begin
      for i:=1 to 255 do
      begin
        Chars[i] := #0;
      end;  Str := 'leetest'+#0;
      for i:=0 to Length(Str) do
      begin
        Chars[i] := Str[i];
      end;  Pstr := @Chars;
    end;
    宿主程序部分:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Msg: string;
      PStr: Pchar;
    begin
      PStr := nil;
      StringTest(PStr);
      Msg := PStr;
      ShowMessage(Msg);
    end;
    程序出现非法访问错误,经察看帮助得知是因为不能将函数中的局部变量的地址返回所至
    帮助信息如下
    A common error when working with PChars is to store in a data structure, or 
    return as a value, a local variable. When your routine ends, the PChar will 
    disappear because it is simply a pointer to memory, and is not a reference 
    counted copy of the string. For example:function title(n: Integer): PChar;
    var
      s: string;
    begin
      s := Format('title - %d', [n]);
      Result := PChar(s); // DON'T DO THIS
    end;This example returns a pointer to string data that is freed when the 
    title function returns.
    现在想知道到底如何是正确的做法.
      

  2.   

    Str := 'leetest'+#0;
      for i:=1to Length(Str) do
      begin
        Chars[i-1] := Str[i];
      end;
      

  3.   

    getmem(PStr,256);
      StringTest(PStr);
      

  4.   

    我修改程序成这个样子...
    dll的函数
    function StringTest(out Pstr: Pchar): integer;
    var
      Str: string;
      i: integer;
    begin
      Str := 'leetest';
      StrPCopy(Pstr, Str);
    end;
    宿主程序部分
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Msg: string;
      PStr: Pchar;
    begin
      getmem(PStr, 256);
      StringTest(PStr);
      Msg := PStr;
      ShowMessage(Msg);
    //  FreeMem(Pstr, 256);
    end;
    现在的依然会有内存错误,不过变成了第1,3,5次点击会出错,第2,4,6次能显示数据,但是
    只显示了'est',请继续指教,谢谢...
    另外,如果加上FreeMem的那一句,会出'不正确的指针操作'这样的错误.