dll中如何改变指针的大小?(200分)

  • 主题发起人 主题发起人 newyj
  • 开始时间 开始时间
N

newyj

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我的一个测试程序

library PrjDll;
uses
windows, SysUtils, Classes;
{$R *.RES}
function file2char(var 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);
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)
//如果分配的内存比实际需要的大没问题,小了就不行;
//我想知道dll中如何去改变内存大小;好像ReallocMem不行
p[0]:=#0;
isize:=file2char(p);
if isize>0 then
begin
richedit1.Clear;
richedit1.Lines.add(p);
end
else richedit1.Lines.add('dfadfdas');
freemem(p,isize);
p:=nil;

end;


 
下面是我的试验的代码, 没发现什么问题.

library PrjDLL;
uses
windows,
SysUtils,
Classes;

{$R *.RES}
function file2char(var P:PChar):integer
stdcall;export;
//加不加var 有何区别 ?
//好像结果都正确;
var
fm:Tfilestream;
begin
MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);
fm:=Tfilestream.Create('c:/autoexec.bat',fmopenread);
result := fm.size;

ReallocMem(p,fm.size);
MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);
//GlobalReAlloc(integer(@p),GMEM_ZEROINIT ,fm.size);
fm.read(p^,fm.size);
fm.Free;
end;
exports
file2char;
begin
end.





unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation


{$R *.dfm}
function file2char(var P:PChar):integer
stdcall;external 'PRJDLL.DLL';

procedure TForm1.Button1Click(Sender: TObject);
var
p:PChar
isize:integer;
begin
getmem(p,8)
//如果分配的内存比实际需要的大没问题,小了就不行;
//我想知道dll中如何去改变内存大小;好像ReallocMem不行
MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);
p[0]:=#0;
isize:=file2char(p);
MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);
if isize>0 then
begin
richedit1.Clear;
richedit1.Lines.add(PChar(p));
end
else richedit1.Lines.add('dfadfdas');
FreeMem(p);
p:=nil;

end;
end.
 
var:过程中可以改变该参数,默认是这样
const:过程中只读

重新分配指针的内存,你试一试先不分配内存,到了dll中再分配
 
to tseug
好像p的内存地址不一样
 
没人帮忙吗?
 
虽然没解决
 
后退
顶部