指针结构变量的DLL返回结果错误。
haj77 2012-02-03 11:00:39 最近需要编写一个DLL文件,供其他系统调用,目的是返回大量数据记录,记录结构包括:卡号、时间、机号。
DLL程序如下:
uses
ShareMem, SysUtils...; // 使用到ShareMem
type
//定义刷卡记录结构
PEvent = ^TEvent;
TEvent = Packed record
ChipNo : Pchar; //芯片号码
DotID : Byte; //分控机号ID
Time : Pchar; //刷卡时间
CardType : Byte; //卡片类型
pNext : PEvent; //指针指向下一组卡
end;
//NetIp--设备IP EventCount--返回的总记录数 lpEvent--记录指针
Function GetEvent(NetIp:Pchar;Var EventCount:Word;var lpEvent: PEvent):LongInt; stdcall;
var
EventCount : Word;
pNext : PEvent;
m ,DevID : Integer;
ChipNo ,dTime :String;
begin
EventCount := 2 ;
GetMem( lpEvent, sizeof( TEvent ) * EventCount ); //lpEvent作为变量,在此分配内存 ,不知道对不?
pNext := lpEvent;
For m :=1 to EventCount do
begin
ChipNo :='4A5B3E12'; //芯片号码
dTime :='20111213234512';//刷卡时间
DevID := 1; //刷卡设备
Buffer := AllocMem(Length(ChipNo)+1);
StrpCopy(Buffer,Pchar(ChipNo));
pNext^.ChipNo :=Buffer ;
pNext^.DotID :=DevID;
Buffer := AllocMem(Length(dTime)+1);
StrpCopy(Buffer,Pchar(dTime));
pNext^.Time :=Buffer;
if M<>EventCount-1 then
begin
pNext^.pNext := PEvent( DWord( pNext ) + sizeof( TEvent ) );
pNext := pNext^.pNext;
end
else
begin
pNext^.pNext := nil;
end;
end;
Result :=0;
end;
主程序如下:
TGetEvent =Function(NetIp:Pchar;Var EventCount:Word;var lpEvent: PEvent):LongInt; stdcall;
procedure TTestMain_Frm.Button15Click(Sender: TObject);
var
Rest : Longint;
NetIp : Pchar;
pCard : PEvent;
begin
NetIp := Pchar('192.168.1.1');
//GetMem( pCard, sizeof( TEvent ) * 2); // 定义内存空间也报错!
Rest := GetEvent (NetIp,EventCount,pCard);
if Rest=0 then
begin
for i:=0 to 1 do //这里只能取到到最后一条记录,循环2次就报错!
begin
if ppNext <> nil then
begin
Str := IntToStr(i+1)+' 卡芯片号码:'+Pchar(ppNext^.ChipNo)+ ' 卡类型:'+IntToStr(ppNext^.CardType);
memo1.Lines.Add(str);
ppNext := ppNext^.pNext;
end
else break;
end ;
dispose(pCard); //释放变量指针内存。
end;
end;
问题:
DLL代码如果不封装,直接放到Delphi中,以上代码没有问题,能取到2条记录;但是封装DLL后,调用,就报错,这个DLL还用提供其他语言使用,搞了2天了,不知道啥原因???