library PrjDll;
uses
  windows,    SysUtils,  Classes;
{$R *.RES}function file2char(P:Pchar):integer; stdcall;export;
//因为是指针,所以不要加Var
var
  fm:Tfilestream;
begin
  fm:=Tfilestream.Create('1.txt',fmopenread);
  result := fm.size;
  //ReallocMem(p,fm.size);
  //GlobalReAlloc(integer(@p),GMEM_ZEROINIT ,fm.size);
  p := StrAlloc(fm.size); //在这里分配
  fm.read(p^,fm.size);
  fm.Free;
end;
exports
  file2char;
begin
end./////调用procedure TForm1.Button1Click(Sender: TObject);
var
  p:pchar;
  isize:integer;
begin
  //getmem(p,8);   //不要使用GetMem来分配内存,即使是pointer型,也尽量使用new来分配内存
  p := StrAlloc(8); // 这句话是多余的,会造成8位的内存泄漏
  p[0]:=#0;
  isize:=file2char(p); //p做为参数传进去为何要先分配内存?
  if isize>0 then
  begin
    richedit1.Clear;
    richedit1.Lines.add(p);
  end
  else richedit1.Lines.add('dfadfdas');
  //freemem(p,isize);
  StrDispose(p, isize); //同样要使用StrDispose释放
  p:=nil;end;

解决方案 »

  1.   

    加var的意思是p变参,也就是可以函数的中的改变影响到参数。
    但是你程序中没有改变p值的地方,所以结果一样。
    第二个问题不清楚,不过我同意楼上的意见,因为我也是这样分配内存的。
      

  2.   

    to crob(干净的袜子)
    StrDispose,StrAlloc 实际就是调用freemem,getmem;
    在dll中分配内存外面释放不合理。
    你的程序好像不行
     
      

  3.   

    首先传入使增加指针长度参数
    function file2char(var P:Pchar; var len: Integer):integer; stdcall;export;
    var
      fm:Tfilestream;
    begin
      fm:=Tfilestream.Create('1.txt',fmopenread);
      result := fm.size;
      if len <= fm.size then
      begin
        ReallocMem(p, fm.size + 1);
        len := fm.size + 1;
      end;
      fm.read(p^,fm.size);
      (p + fm.size)^ := #0;
      fm.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      p:pchar;
      len, isize:integer;
    begin
      getmem(p,8);
      len := 8;
      p[0]:=#0;
      isize:=file2char(p, len);
      if isize>0 then
      begin
        richedit1.Clear;
        richedit1.Lines.add(p);
      end
      else richedit1.Lines.add('dfadfdas');
    freemem(p,len); // or freemem(p);
      p:=nil;end;
      

  4.   

    ReallocMem申请到的长度不一定是传入参数的长度,可能多几个字节。
      

  5.   

    如果我知道 要该多大我就在dll 中直接分配了