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;
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;
但是你程序中没有改变p值的地方,所以结果一样。
第二个问题不清楚,不过我同意楼上的意见,因为我也是这样分配内存的。
StrDispose,StrAlloc 实际就是调用freemem,getmem;
在dll中分配内存外面释放不合理。
你的程序好像不行
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;