我用delphi调用vc dll中的一个函数 函数如下 function YBReadInfo (port:longint;lpPersonInfo:PLRPERSONINFO):LongInt; 参数说明:
port:读卡器连接端口号;
lpPersonInfo:职工个人信息结构
typedef struct LRPERSONINFO //个人信息
{
char sPersonId[10]; //职工医保号
char sPersonName[10]; //职工姓名
char sPersonType[2]; //职工类型(1在职/3 退休/4离休/5二乙伤残军人)
char sSex[3]; //性别
char sBirthday[11]; //出生日期(格式为yyyy-mm-dd)
int nAge; //年龄
char sUnitId[6]; //单位医保号
char sUnitName[50]; //单位名称
char sChronicFlag[2]; //是否属于慢性病(0否/1是)
char sChronicId[3]; //慢性病编码
char sChronicName[50]; //慢性病名称
char sMedicareFlag[2]; //是否参加基本医疗(0否/1是)
char sSalvationFlag[2]; //是否参加大病救助(0否/1是)
char sInjureFlag[2]; //是否参加工伤保险(0否/1是)
char sProcreateFlag[2]; //是否参加生育保险(0否/1是)
char sTcpayFlag[2]; //是否可以统筹支付(0否/1是)
char sDbpayFlag[2]; //是否可以大病支付(0否/1是)
char sGwypayFlag[2]; //是否可以公务员补助支付(0否/1是)
char sJoinDate[11]; //参保时间(格式为yyyy-mm-dd)
double fBalance; //帐户余额
}LRPERSONINFO,*PLRPERSONINFO; D、返回值:
=1 成功
〈1 失败
我写的是这样的
type
LRPERSONINFO = record //个人信息
sPersonId : array[1..10] of Char; //职工医保号
sPersonName :string; //职工姓名
sPersonType :string; //职工类型(1在职/3 退休/4离休/5二乙伤残军人)
sSex :string; //性别
sBirthday :string; //出生日期(格式为yyyy-mm-dd)
nAge :Integer; //年龄
sUnitId :string; //单位医保号
sUnitName :string; //单位名称
sChronicFlag :string; //是否属于慢性病(0否/1是)
sChronicId :string; //慢性病编码
sChronicName :string; //慢性病名称
sMedicareFlag :string; //是否参加基本医疗(0否/1是)
sSalvationFlag :string; //是否参加大病救助(0否/1是)
sInjureFlag :string; //是否参加工伤保险(0否/1是)
sProcreateFlag :string; //是否参加生育保险(0否/1是)
sTcpayFlag :string; //是否可以统筹支付(0否/1是)
sDbpayFlag :string; //是否可以大病支付(0否/1是)
sGwypayFlag :string; //是否可以公务员补助支付(0否/1是)
sJoinDate :string; //参保时间(格式为yyyy-mm-dd)
fBalance :Double; //帐户余额
end;
PLRPERSONINFO = ^LRPERSONINFO;function YBReadInfo (port:longint;var lpPersonInfo:PLRPERSONINFO):LongInt; stdcall; external ZGYBDLL;
我这样调用的 var ZGXX:PLRPERSONINFO;
SDS:string;
GetMem(ZGXX,1024*1024);
if YBReadInfo(1,ZGXX)=1 then
begin
ShowMessage('读卡成功!');
SDS:=ZGXX^.sPersonId;
ShowMessage(SDS);
cp_ZGJM:=1;
IL_Result:=0;
end;
执行时返回的是1 但是执行到 SDS:=ZGXX^.sPersonId; 时 报地址错误 请哪位高手指点下。
port:读卡器连接端口号;
lpPersonInfo:职工个人信息结构
typedef struct LRPERSONINFO //个人信息
{
char sPersonId[10]; //职工医保号
char sPersonName[10]; //职工姓名
char sPersonType[2]; //职工类型(1在职/3 退休/4离休/5二乙伤残军人)
char sSex[3]; //性别
char sBirthday[11]; //出生日期(格式为yyyy-mm-dd)
int nAge; //年龄
char sUnitId[6]; //单位医保号
char sUnitName[50]; //单位名称
char sChronicFlag[2]; //是否属于慢性病(0否/1是)
char sChronicId[3]; //慢性病编码
char sChronicName[50]; //慢性病名称
char sMedicareFlag[2]; //是否参加基本医疗(0否/1是)
char sSalvationFlag[2]; //是否参加大病救助(0否/1是)
char sInjureFlag[2]; //是否参加工伤保险(0否/1是)
char sProcreateFlag[2]; //是否参加生育保险(0否/1是)
char sTcpayFlag[2]; //是否可以统筹支付(0否/1是)
char sDbpayFlag[2]; //是否可以大病支付(0否/1是)
char sGwypayFlag[2]; //是否可以公务员补助支付(0否/1是)
char sJoinDate[11]; //参保时间(格式为yyyy-mm-dd)
double fBalance; //帐户余额
}LRPERSONINFO,*PLRPERSONINFO; D、返回值:
=1 成功
〈1 失败
我写的是这样的
type
LRPERSONINFO = record //个人信息
sPersonId : array[1..10] of Char; //职工医保号
sPersonName :string; //职工姓名
sPersonType :string; //职工类型(1在职/3 退休/4离休/5二乙伤残军人)
sSex :string; //性别
sBirthday :string; //出生日期(格式为yyyy-mm-dd)
nAge :Integer; //年龄
sUnitId :string; //单位医保号
sUnitName :string; //单位名称
sChronicFlag :string; //是否属于慢性病(0否/1是)
sChronicId :string; //慢性病编码
sChronicName :string; //慢性病名称
sMedicareFlag :string; //是否参加基本医疗(0否/1是)
sSalvationFlag :string; //是否参加大病救助(0否/1是)
sInjureFlag :string; //是否参加工伤保险(0否/1是)
sProcreateFlag :string; //是否参加生育保险(0否/1是)
sTcpayFlag :string; //是否可以统筹支付(0否/1是)
sDbpayFlag :string; //是否可以大病支付(0否/1是)
sGwypayFlag :string; //是否可以公务员补助支付(0否/1是)
sJoinDate :string; //参保时间(格式为yyyy-mm-dd)
fBalance :Double; //帐户余额
end;
PLRPERSONINFO = ^LRPERSONINFO;function YBReadInfo (port:longint;var lpPersonInfo:PLRPERSONINFO):LongInt; stdcall; external ZGYBDLL;
我这样调用的 var ZGXX:PLRPERSONINFO;
SDS:string;
GetMem(ZGXX,1024*1024);
if YBReadInfo(1,ZGXX)=1 then
begin
ShowMessage('读卡成功!');
SDS:=ZGXX^.sPersonId;
ShowMessage(SDS);
cp_ZGJM:=1;
IL_Result:=0;
end;
执行时返回的是1 但是执行到 SDS:=ZGXX^.sPersonId; 时 报地址错误 请哪位高手指点下。
function YBReadInfo (port:longint;var lpPersonInfo:PLRPERSONINFO):LongInt; stdcall; external ZGYBDLL;貌似你不该用stdcall,而是 cdell吧?
至少,在c的code里应该指明 _stdcall 才能 stdcall调用。否则一律用cdell(名字可能打错,请用cnPack 来输入)