我在delphi里调用vc写的dll里的函数,这个函数有指针。
dll函数调用后,返回值给指针,之后,我再用我的指针,做什么操作都出错,请问怎么解决?谢谢
定义的指针如下:
PCustomerInfo = ^TCustomerInfo;
TCustomerInfo = record
AccountNO: integer; //账号序号
CardNO: Word; //卡号
Status: Byte; //卡状态 F1H=正常 F3H=挂失
Sort: Byte; //卡类别
Pwd: Word; //个人密码
Amount: integer; //总额 单位:分
Balance: integer; //自费余额 单位:分
OpCount: Word; //操作计数
SerialNO: Byte; //个人持卡序号
SubsideBalance: Integer; //个人补助余额 单位:分
end;声明的dll函数如下:
function CapGetNBCardInfo(hport: THandle; ApCustomerInfo: PCustomerInfo): SmallInt;stdcall;
external change name 'CapGetNBCardInfo';过程如下:
procedure TMainForm.Button2Click(Sender: TObject);
var
pCus: PCustomerInfo;
i: SmallInt;
begin
New(pCus);
i := CapGetNBCardInfo(port,pCus);
if i = 0 then
begin
Edit1.Text := IntToStr(pCus^.AccountNO);
end;
Dispose(pCus);
end;
dll函数调用后,返回值给指针,之后,我再用我的指针,做什么操作都出错,请问怎么解决?谢谢
定义的指针如下:
PCustomerInfo = ^TCustomerInfo;
TCustomerInfo = record
AccountNO: integer; //账号序号
CardNO: Word; //卡号
Status: Byte; //卡状态 F1H=正常 F3H=挂失
Sort: Byte; //卡类别
Pwd: Word; //个人密码
Amount: integer; //总额 单位:分
Balance: integer; //自费余额 单位:分
OpCount: Word; //操作计数
SerialNO: Byte; //个人持卡序号
SubsideBalance: Integer; //个人补助余额 单位:分
end;声明的dll函数如下:
function CapGetNBCardInfo(hport: THandle; ApCustomerInfo: PCustomerInfo): SmallInt;stdcall;
external change name 'CapGetNBCardInfo';过程如下:
procedure TMainForm.Button2Click(Sender: TObject);
var
pCus: PCustomerInfo;
i: SmallInt;
begin
New(pCus);
i := CapGetNBCardInfo(port,pCus);
if i = 0 then
begin
Edit1.Text := IntToStr(pCus^.AccountNO);
end;
Dispose(pCus);
end;
{ //长度(字节)//内容
long lCustomerID; //3 //账号序号
long lCardNO; //2 //卡号
long lStatus; //1 //卡状态 F1H=正常 F3H=挂失
long lKlb; //1 //卡类别
long strPWD; //2 //个人密码
long lZe; //3 //总额 单位:分
long lYe; //3 //自费余额 单位:分
long lOpCount; //2 //操作计数
long lCardSN; //1 //个人持卡序号
long lSubYe; //3 //个人补助余额 单位:分
}CustomerInfo,FAR *FPCustomerInfo;读卡函数
int CapGetNBCardInfo (HANDLE hPort,CustomerInfo * fvst)
//长度(字节)//内容
lCustomerID: longint ; //3 //账号序号
lCardNO: longint ; //2 //卡号
lStatus: longint ; //1 //卡状态 F1H=正常 F3H=挂失
lKlb: longint ; //1 //卡类别
strPWD: longint ; //2 //个人密码
lZe: longint ; //3 //总额 单位:分
lYe: longint ; //3 //自费余额 单位:分
lOpCount: longint ; //2 //操作计数
lCardSN: longint ; //1 //个人持卡序号
lSubYe: longint ; //3 //个人补助余额 单位:分
end;
CustomerInfo = tagCustomerInfo;
FPCustomerInfo = ^ CustomerInfo;
function CapGetNBCardInfo (hPort: THANDLE ;var fvst: CustomerInfo): Integer; cdecl; external 'somedll.dll' name 'CapGetNBCardInfo';
第一:VC的函数里是指针,到delphi里怎么不定义指针啊?
第二:如果按照楼主的写法,Button2Click的代码里不用定义指针了吧?只要定义记录类型就可以了吧?我做了测试,还是出错
2. 直接定义结构体就可以。出错的话,建议写具体的错误提示信息,不要贴图(我看不了)。
提示是: Access violation at address 00000001. Read of address 00000001由于我才进入此论坛,不懂规矩,分可能给的少,请见谅!
function CapGetNBCardInfo (hPort: THANDLE ;var fvst: CustomerInfo): Integer; stdcall; external 'somedll.dll' name 'CapGetNBCardInfo';
{ //长度(字节)//内容
long lCustomerID; //3 //账号序号
long lCardNO; //2 //卡号
long lStatus; //1 //卡状态 F1H=正常 F3H=挂失
long lKlb; //1 //卡类别
long strPWD; //2 //个人密码
long lZe; //3 //总额 单位:分
long lYe; //3 //自费余额 单位:分
long lOpCount; //2 //操作计数
long lCardSN; //1 //个人持卡序号
long lSubYe; //3 //个人补助余额 单位:分
}CustomerInfo,FAR *FPCustomerInfo; 读卡函数
int CapGetNBCardInfo (HANDLE hPort,CustomerInfo * fvst)
--------------------------------------------------------------------
//长度(字节)//内容看你这里的注释,估计不是这么简单定义结构体,可能VC中定义变量用到了位域。但是头文件中定义的又不是,麻烦。可能VC真实的定义是这样的:
long lCustomerID:3;
long lCardNO:1;
/...
是不是这样,那就需要自己去试验一下看了。。
首先,传进去的结构远远大过于一个4字节的long类型,所以DLL在输出的时候,并不会访问溢出,而由于内存是主调用程序分配的,访问的时候也不会溢出。再则楼主已经9楼说了,值已经取到,那么极有可能就是高用方式stdcall/cdecl/...的区别,导致的问题。