C++代码翻译成delphi代码

bluegloom 2010-01-25 12:28:00
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;
...全文
97 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluegloom 2010-02-22
  • 打赏
  • 举报
回复
该问题已经解决,呵呵,谢谢各位的解答。是我自己搞定的
柯本 2010-01-25
  • 打赏
  • 举报
回复
按你的调用方法:
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的


16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧