我用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; 时 报地址错误  请哪位高手指点下。

解决方案 »

  1.   

    调用通用dll最好不要string类型,改为pchar类型 pchar就是char数组
      

  2.   


    function YBReadInfo (port:longint;var lpPersonInfo:PLRPERSONINFO):LongInt; stdcall; external ZGYBDLL;貌似你不该用stdcall,而是 cdell吧?
    至少,在c的code里应该指明 _stdcall 才能 stdcall调用。否则一律用cdell(名字可能打错,请用cnPack 来输入)
      

  3.   

    楼上已经说了定义的结构用pchar分配内存或者数组stdcall or cdcel调用惯例,不清楚就都试试
      

  4.   

    把tring类型改为Char数组.如sPersonId : array[1..10] of Char一样