C++代码如下:
 int Query_Pos_Card12(HANDLE icdev,LPINT CardType, LPINT Opt_Num, LPINT Serno,LPSTR Cardno, 
unsgind long * CardSerno, LPINT Value,LPINT Count,LPINT UserType,,LPINT Consum_Add, LPINT use_term , 
int WaitTime) 并且给出在delphi中如何调用,我的调用过程如下:
procedure TForm1.Button2Click(Sender: TObject);
var
 MlngCardID:PInteger;               //卡流水号
 MstrPressWorkID:string;           //用户对外编号
 MlngCardTypeID:PInteger;           //卡类型(0 - 用户卡,1 - 操作员卡,2 - 系统卡,4 - 空白卡)
 MlngValue1:PInteger;               //卡剩余金额:实际金额*100
 MlngCount1:PInteger;                  //卡消费次数
 MLngConsumAdd:PInteger;               //上次消费的消费机地址
 MLngUseTerm:PInteger;                 //单位为月,<255。暂时未开放次功能,此参数必需为0。
 MlngSaleOperatorID:PInteger;           //上次消费时使用的设备的管理员卡编号
 MlngAddCount:PInteger;                 //当天的累计消费次数
 MlngCardUsageType:PInteger;           //用户卡类型(1-8)
 strTerm:string;  //有效期字符串
 intRet:Integer;
 i:Integer;
 //MlngFactoryFixID:PUINT;
 je:Double;
 Dev:integer;
 CardType:integer;
 usetype:integer;
 Opt_Num:integer;
 serno:integer;
 cardno:string;
 cardserno:longint;
 Value:integer;
 count:integer;
 usertype:integer;
 Consum_Add:integer;
 Use_Term:integer;
 AddCount:integer;
 WaitTime:integer;
begin
  //================================赋初始值
    New(MlngFactoryFixID);
    New(MlngCardID);
    //New(MstrPressWorkID);
    New(MlngCardTypeID);
    New(MlngValue1);
    New(MlngCount1);
    New(MLngConsumAdd);
    New(MLngUseTerm);
    New(MlngSaleOperatorID);
    New(MlngAddCount);
    New(MlngCardUsageType);
    MlngFactoryFixID^ := 1;               //卡序列号,已固化
    MlngCardID^ := 1;
    MstrPressWorkID := '';
    MlngCardTypeID^ := 1;
    MlngValue1^ := 1;
    MlngCount1^ := 1;
    MlngAddCount^ := 1;
    MLngConsumAdd^ := 1;
    MLngUseTerm^ := 1;
    MlngSaleOperatorID^ := 1;    If MlngCommPortHandle <= 0 Then
    begin
        ShowMessage('读写器未打开,请打开读写器');
        Exit;
    End;    For i := 1 To 3 do
    begin
        intRet := Query_Pos_Card12(MlngCommPortHandle,MlngCardUsageType, MlngSaleOperatorID,MlngCardID,pchar(MstrPressWorkID),
                  MlngFactoryFixID,MlngValue1, MlngCount1,MlngCardTypeID,MLngConsumAdd,MLngUseTerm,MlngAddCount,200);
      //intRet := Query_Pos_Card12(dev, usetype, opt_Num, serno, cardno, cardserno, value, count, cardtype, Consum_Add, use_term, AddCount, 200);
        If intRet = 0 Then break;
    end;
    
    If intRet = 0 Then
    begin
         Case MlngCardUsageType^  of
             0:
               begin
                je:=MlngValue1^/100;
                strTerm := '20'+leftstr(IntToStr(MLngUseTerm^),2) +' 年' +midstr(IntToStr(MLngUseTerm^), 3, 2) + ' 月' + Rightstr(IntToStr(MLngUseTerm^),2) +' 日';
                memo1.lines.add('消费用户卡,卡固化编号为:' + IntToStr(MlngFactoryFixID^) + 'r,卡金额为:' + FloatToStr(je));
                memo1.lines.add('卡有效期为:' + strTerm + '卡编号为:' + MstrPressWorkID + 'CARDID为:' +inttostr(MlngCardID^) + '使用次数为:' + IntToStr(MlngAddCount^));
               end;
             1:
               memo1.lines.add('营业员卡');
             2:
               memo1.lines.add('系统卡');
             4:
               memo1.lines.add('空白卡');
        End;
        BeepReader(1);
    end
    Else
      memo1.lines.add('读卡错误!错误信息:'+GetCardErr(intRet));
    Dispose(MlngFactoryFixID);
    Dispose(MlngCardID);
    //Dispose(MstrPressWorkID);
    Dispose(MlngCardTypeID);
    Dispose(MlngValue1);
    Dispose(MlngCount1);
    Dispose(MLngConsumAdd);
    Dispose(MLngUseTerm);
    Dispose(MlngSaleOperatorID);
    Dispose(MlngAddCount);
    Dispose(MlngCardUsageType);
end;

解决方案 »

  1.   

    按你的调用方法:
    function Query_Pos_Card12(icdev:THANDLE ;CardType:pinteger;Opt_Num:pinteger; Serno:pinteger;Cardno:pinteger;
     CardSerno:pdword; Value:pinteger; Count:pinteger;UserType:pinteger;Consum_Add:pinteger;use_term :pinteger;
     WaitTime:integer):integer; cdecl;external 'iclib.dll';
    注意,其中的cdecl因为你的C函数没有指明调用方式,C缺省为cdecl,后面的为你的DLL名其实不用这么复杂:
    你可这样定义:
    function Query_Pos_Card12(icdev:THANDLE ;var CardType:integer;var Opt_Num:integer; var Serno:integer;var Cardno:integer;
     CardSerno:pdword; var Value:integer; var Count:integer;var UserType:integer;var Consum_Add:integer;use_term :pinteger;
     WaitTime:integer):integer; cdecl;external 'iclib.dll';
    调用时直接将变量代入就可以了,不用定义成pinteger,再用new的