我在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;

解决方案 »

  1.   

    DLL是别人给的动态库,不知道代码
      

  2.   

    那头文件总该有吧?要不然,你怎么写的Delphi调用函数?
      

  3.   

    typedef struct tagCustomerInfo
    { //长度(字节)//内容
    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)
      

  4.   

    type tagCustomerInfo = record
     //长度(字节)//内容 
    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';
      

  5.   

    不明白的地方:
    第一:VC的函数里是指针,到delphi里怎么不定义指针啊?
    第二:如果按照楼主的写法,Button2Click的代码里不用定义指针了吧?只要定义记录类型就可以了吧?我做了测试,还是出错
      

  6.   

    1. 你可以使用指针,但是由于是输出参数,可以通过var直接传递。
    2. 直接定义结构体就可以。出错的话,建议写具体的错误提示信息,不要贴图(我看不了)。
      

  7.   

    我按照您说的做了,值能得到,但出错。
    提示是:  Access violation at address 00000001. Read of address 00000001由于我才进入此论坛,不懂规矩,分可能给的少,请见谅!   
      

  8.   

    这个出错,就难以找出问题了。可以试着把函数的引入声明改为:
    function CapGetNBCardInfo (hPort: THANDLE ;var fvst: CustomerInfo): Integer; stdcall; external 'somedll.dll' name 'CapGetNBCardInfo';
      

  9.   

    typedef struct tagCustomerInfo 
    //长度(字节)//内容 
    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;
    /...
    是不是这样,那就需要自己去试验一下看了。。
      

  10.   

    如果是这样子的话,传递进去的是一个指针,并不可能导致异常。
    首先,传进去的结构远远大过于一个4字节的long类型,所以DLL在输出的时候,并不会访问溢出,而由于内存是主调用程序分配的,访问的时候也不会溢出。再则楼主已经9楼说了,值已经取到,那么极有可能就是高用方式stdcall/cdecl/...的区别,导致的问题。