导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/8/19 16:31:04
标题:
还是C代码翻译的问题。请大家帮忙转换成delphi7的代码
浏览:1602
加入我的收藏
楼主:
/*参数 COMID 串口号 CardID IC卡号; CardGas 卡内剩余气量 ; IcNum 为发卡次数 IcMark 为卡片备注 passbuf 为加密信息,128位 */ int __stdcall Bank_Read(int COMID,char * cardid,int *cardgas,int * icnum,int *icmark,char *passBuff); int __stdcall Bank_Write(int COMID,char * cardid,int cardgas,char * passbuf); **********以上是厂家给的C代码,动态库函数的调用方法********** //以下 是Delphi7调用的代码。 function HYYTReadCard(COMID: Integer; CardID: PAnsiChar; var CardGas: Integer; var IcNum, IcMark: Integer; password: PAnsiChar): Integer; stdcall; function HYYTWriteCard(COMID: Integer; CardID: PAnsiChar; var CardGas: Integer; password: PAnsiChar): Integer; stdcall; function HYYTReadCard; external 'HYYT_Card.dll' name 'Bank_Read'; function HYYTWriteCard; external 'HYYT_Card.dll' name 'Bank_Write'; procedure TYzqtMainForm.btn2Click(Sender: TObject); //---衡阳燃气(银通卡)读卡 var gStat1:integer; COMID: integer; //串口号,1送0 CardID: array[1..10] of char; // 卡号 CardGas: integer; // 卡内余量 IcNum: integer; //发卡次数 IcMark: integer; //备注信息 password: array[1..200] of char; //卡密 begin gStat1:=HYYTReadCard(COMID,@CardID,CardGas,IcNum,IcMark,@password); if gStat1=0 then begin showmessage('读卡成功!'); //showmessage(inttostr(ICErroy)+':'+trim(ErroyMsg)) ; showmessage('@串口号comm:@'+inttostr(COMID)+'@'); showmessage('@用户卡编号@'+CardID+'@'); showmessage('@卡内余量@'+inttostr(CardGas)+'@@'); showmessage('@发卡次数@'+inttostr(IcNum)+'@@'); showmessage('@发卡备注@'+inttostr(IcMark)+'@@'); edt1.Text:= trim(password); end; end; 出现的问题是,除了 password: array[1..200] of char; //卡密 这一项获取了数据,其他字段都没数据,都为0或者为空。不知道是不是delphi代码写得有问题。希望得到指教。翻译一下厂家的两行代码。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/19 16:45:11
1楼:
奇怪的是,卡号和卡密是同样的方法调用,但是卡号就没数据。 另外三个整形的参数,是不是我定义有问题。不太清楚指针的准确定义。 希望大家能帮忙翻译下。感谢
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/19 17:47:33
2楼:
数组名本身就可以表示数组入口地址。 但是这个太小众了。 @数组名这种方式就更非主流了。 @CardId[1], @Password[1] 改成这样看看
----------------------------------------------
--
作者:
2019/8/20 9:35:31
3楼:
感谢楼上的回复,之前试过了。不行。头疼,哪位高手帮忙解决下,把厂家的读写卡函数翻译下
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
hexi (Hexi)
★☆☆☆☆
-
盒子活跃会员
2019/8/20 9:40:58
4楼:
试试把Integer换成NativeInt 或: CardID: array[1..10] of Ansichar; // 卡号 password: array[1..200] of Ansichar; //卡密
----------------------------------------------
-
作者:
2019/8/20 10:11:33
5楼:
还是一样的。没变化。卡号不行。卡密有数据
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/20 11:11:53
6楼:
COMID到底怎么传的?这个一看就是输入参数。而你的代码并没有给值。 最好把厂家的demo代码贴出来看看。
----------------------------------------------
--
作者:
2019/8/20 11:26:09
7楼:
COMID 这个写变量和送0,都是一样的。后面的参数只有卡密有数据。 唉,厂家也没给demo,就给了这两个函数的C定义。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/20 15:05:41
8楼:
没有实际的东西来调试,所以只能给你点建议了 char * 转为 PByte 试试
----------------------------------------------
-
作者:
2019/8/20 15:31:39
9楼:
你把商家DLL发上来,至少可以用OD调试看看,要不然也看不出你哪里有问题啊! 你之前发过这样的贴,到最后也是没解决吗?还是那个问题?
----------------------------------------------
-
作者:
2019/8/20 15:34:42
10楼:
看C定义和你写的定义是没啥问题的,之前给你说了,你用VC试试可以不
----------------------------------------------
-
作者:
2019/8/20 15:47:47
11楼:
大概楼主是要保密吧。 否则一个 DEMO 源码 和 DLL 一发,多半大家帮忙运行 DEBUG 一下,就知道了。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/8/20 17:20:32
12楼:
感谢大家的回复。 是的,之前我也发了一个另外厂家的,也没解决,也是在要对方的demo中 我是没啥保密的,主要是厂家没有demo给我,都是大爷样的,还得求人家要demo,人家都不爱搭理咱,唉。痛苦。就这么一段代码,要我自己研究。dll我马上发出来。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/20 21:15:13
13楼:
基本上不好做测试,我感觉有以下几点: 1.缺少Mwic_32.dll文件,查百度貌似是明华公司IC设备的SDK 2.感觉这DLL读取的是IC卡硬件数据,所以需要硬件支持。 3.Mwic_32.dll中有特权指令(out,in)要执行,应该需要内核驱动支持。 你发的DLL应该是对Mwic_32.dll功能的封装 https://blog.csdn.net/qq_27832057/article/details/83930972 你参考这篇文章看看吧!
----------------------------------------------
-
作者:
2019/8/21 10:21:47
14楼:
看样子像是IcMark这个参数类型不太对, 可以这样试一下: procedure TYzqtMainForm.btn2Click(Sender: TObject); //---衡阳燃气(银通卡)读卡 var gStat1:integer; COMID: integer; //串口号,1送0 CardID: array[1..10] of char; // 卡号 CardGas: integer; // 卡内余量 IcNum: integer; //发卡次数 IcMark: array[0..31]; //备注信息 PIcMark: PInteger; password: array[1..200] of char; //卡密 begin COMID := 0; //不指定端口号也能读? PIcMark:= PInteger(@IcMark[0]); gStat1:=HYYTReadCard(COMID,@CardID,CardGas,IcNum,PIcMark^,@password); end;
----------------------------------------------
报到
作者:
2019/8/21 11:11:18
15楼:
感谢楼上两位的回复 to helyna : Mwic_32.dll这个文件有,放在了厂家给的dll同一个文件夹下,忘记给出来了。马上补。 to zhangl (二黑): 现在是除了password这个参数有数据,其他的CardID,等4个参数都没有。还有,PIcMark: PInteger;这样定义话,其他两个整形也要按你这样吧,我的函数声明function HYYTReadCard(COMID: Integer; CardID: PAnsiChar; var CardGas: Integer; var IcNum, IcMark: Integer; password: PAnsiChar): Integer; stdcall;是不是也要修改,如何修改呢
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/21 11:19:41
16楼:
我只是感觉备注应该是字符串类型, 你可以修改函数声明, 传个Buffer指针试试看
----------------------------------------------
报到
作者:
2019/8/21 12:07:20
17楼:
需要硬件支持吗?也就是你测试的时候,需要插入IC卡?如果需要的话,没法测试啊
----------------------------------------------
-
作者:
2019/8/21 12:15:08
18楼:
有特权指令,商家发你的时候,是不是还有其他安装包?这个安装包应该包含驱动程序。
----------------------------------------------
-
作者:
2019/8/21 13:55:32
20楼:
to helyna :厂家就给了两个dll,两行代码。没有什么安装包。 然后有读卡器和卡,进行测试。只能写好了程序用卡来测试。 to zhangl (二黑): 按厂家给的两行代码都是整形的。要如何修改,能麻烦帮忙修改下我的代码。我测试下吗? 方便的话能加个微信或者QQ及时向你请教吗?我是25220064,两个同号。谢谢
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/21 14:08:15
21楼:
//以下 是Delphi7调用的代码。 function HYYTReadCard(COMID: Integer; CardID: PAnsiChar; var CardGas, IcNum: Integer; IcMark: PAnsiChar; password: PAnsiChar): Integer; stdcall; function HYYTWriteCard(COMID: Integer; CardID: PAnsiChar; CardGas: Integer; password: PAnsiChar): Integer; stdcall; function HYYTReadCard; external 'HYYT_Card.dll' name 'Bank_Read'; function HYYTWriteCard; external 'HYYT_Card.dll' name 'Bank_Write'; procedure TYzqtMainForm.btn2Click(Sender: TObject); //---衡阳燃气(银通卡)读卡 var gStat1:integer; COMID: integer; //串口号,1送0 CardID: array[1..10] of char; // 卡号 CardGas: integer; // 卡内余量 IcNum: integer; //发卡次数 IcMark: array[1..200] of char; //备注信息 password: array[1..200] of char; //卡密 begin gStat1:= HYYTReadCard(COMID, @CardID[1], CardGas, IcNum, @IcMark[1], @password[1]); if gStat1=0 then begin showmessage('读卡成功!'); //showmessage(inttostr(ICErroy)+':'+trim(ErroyMsg)) ; showmessage('@串口号comm:@'+inttostr(COMID)+'@'); showmessage('@用户卡编号@'+CardID+'@'); showmessage('@卡内余量@'+inttostr(CardGas)+'@@'); showmessage('@发卡次数@'+inttostr(IcNum)+'@@'); showmessage('@发卡备注@'+inttostr(IcMark)+'@@'); edt1.Text:= trim(password); end; end; 试一下, 不一定是这里的问题
----------------------------------------------
报到
作者:
2019/8/21 14:28:32
22楼:
我试了一下,IcMark定义为字符串类型,编译都无法通过。所以肯定是整形。虽然注释是备注,但信息肯定是数字。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/21 15:06:16
23楼:
编译不过是你写的代码的问题, 贴出来看一下
----------------------------------------------
报到
作者:
2019/8/22 8:51:26
24楼:
function HYYTReadCard(COMID: Integer; CardID: PAnsiChar; CardGas: PInteger; IcNum, IcMark: PInteger; password: PAnsiChar): Integer; stdcall; function HYYTWriteCard(COMID: Integer; CardID: PAnsiChar; CardGas: PInteger; password: PAnsiChar): Integer; stdcall; function HYYTReadCard; external 'HYYT_Card.dll' name 'Bank_Read'; function HYYTWriteCard; external 'HYYT_Card.dll' name 'Bank_Write';
----------------------------------------------
-
作者:
2019/8/22 10:34:02
25楼:
其实吧,我一直搞不懂为啥会有改人家函数名的欲望。 另外就是,注释是int*并不一定就说明是数值,也许是utf-32编码的字符。这个具体看厂家提供的文档或者说明。 话说,就俩dll,没有示例就算了,连文档都没有??不是什么三无厂家吧?现在这年头了都是买方市场了,你作为给钱的甲方居然被乙方屌成这熊样??
----------------------------------------------
--
作者:
2019/8/22 11:12:47
26楼:
楼上的只能是猜测。 DLL 的作者最有发言权。结果 作者装死。只给了定义,其他都不给。没辙。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/8/22 20:36:46
27楼:
这个动态库里有个 API 叫 Get_Erorr_Msg 楼主可以把声明要来,如果返回值非零估计可以给出错误提示。不过(API 的拼写错了,应该是 Error,动态库里写成了 Erorr,动态库应该是湖南银通科技有限责任公司提供的) 我写了段代码,可以用于测试读取情况,没有读卡器的情况下,返回值是 40 function Bank_Read(COMID: Integer; cardid, cardgas, icnum, icmark, passBuff: PAnsiChar): Integer; stdcall; external 'HYYT_Card.dll' name 'Bank_Read'; procedure DoTest; const CLineSize = 512 + 2; function Init(P: PAnsiChar): PAnsiChar; begin Result := P; Inc(Result, CLineSize - 2); Result^ := #13; Inc(Result); Result^ := #10; Inc(Result); end; var P1, P2, P3, P4, P5: PAnsiChar; Ret: Integer; FS: TFileStream; begin GetMem(P1, CLineSize * 5); try FillChar(P1^, CLineSize * 5, 32); // 32 -> space P2 := Init(P1); P3 := Init(P2); P4 := Init(P3); P5 := Init(P4); Init(P5); Ret := Bank_Read(0, P1, P2, P3, P4, P5); FS := TFileStream.Create(Format('F:\test_%d.data', [Ret]), fmCreate); try FS.Write(P1^, CLineSize * 5); finally FS.Free; end; finally FreeMem(P1); end; end;
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com