ag游戏庄闲|官方网站
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
?用户名
?密??码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sy1368364703
今日帖子: 12
在线用户: 20
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil ?
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/19 16:31:04
标题:
还是C代码翻译的问题。请大家帮忙转换成delphi7的代码 浏览:445
加入我的收藏
楼主: /*参数
??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代码写得有问题。希望得到指教。翻译一下厂家的两行代码。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/19 16:45:11
1楼: 奇怪的是,卡号和卡密是同样的方法调用,但是卡号就没数据。

另外三个整形的参数,是不是我定义有问题。不太清楚指针的准确定义。

希望大家能帮忙翻译下。感谢
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/8/19 17:47:33
2楼: 数组名本身就可以表示数组入口地址。
但是这个太小众了。
@数组名这种方式就更非主流了。

@CardId[1],?@Password[1]
改成这样看看
----------------------------------------------
--
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
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;??//卡密
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/20 10:11:33
5楼: 还是一样的。没变化。卡号不行。卡密有数据
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/8/20 11:11:53
6楼: COMID到底怎么传的?这个一看就是输入参数。而你的代码并没有给值。

最好把厂家的demo代码贴出来看看。
----------------------------------------------
--
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/20 11:26:09
7楼: COMID?这个写变量和送0,都是一样的。后面的参数只有卡密有数据。

唉,厂家也没给demo,就给了这两个函数的C定义。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 testerhook (CaptainHook) ▲▲▲▲▲ -
普通会员
2019/8/20 15:05:41
8楼: 没有实际的东西来调试,所以只能给你点建议了
char?*?转为?PByte?试试
----------------------------------------------
-
作者:
男 helyna (Person) ▲▲▲▲▲ -
注册会员
2019/8/20 15:31:39
9楼: 你把商家DLL发上来,至少可以用OD调试看看,要不然也看不出你哪里有问题啊!
你之前发过这样的贴,到最后也是没解决吗?还是那个问题?
----------------------------------------------
-
作者:
男 helyna (Person) ▲▲▲▲▲ -
注册会员
2019/8/20 15:34:42
10楼: 看C定义和你写的定义是没啥问题的,之前给你说了,你用VC试试可以不
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/8/20 15:47:47
11楼: 大概楼主是要保密吧。
否则一个?DEMO?源码?和?DLL?一发,多半大家帮忙运行?DEBUG?一下,就知道了。
----------------------------------------------
(C)(P)Flying?Wang
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/20 17:20:32
12楼: 感谢大家的回复。

是的,之前我也发了一个另外厂家的,也没解决,也是在要对方的demo中

我是没啥保密的,主要是厂家没有demo给我,都是大爷样的,还得求人家要demo,人家都不爱搭理咱,唉。痛苦。就这么一段代码,要我自己研究。dll我马上发出来。
此帖子包含附件:happytimes_2019820172032.rar 大小:50.0K
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 helyna (Person) ▲▲▲▲▲ -
注册会员
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
你参考这篇文章看看吧!
----------------------------------------------
-
作者:
男 zhangl (二黑) ★☆☆☆☆ -
盒子活跃会员
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;
----------------------------------------------
报到
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
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;是不是也要修改,如何修改呢
此帖子包含附件:happytimes_2019821111118.rar 大小:48.9K
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 zhangl (二黑) ★☆☆☆☆ -
盒子活跃会员
2019/8/21 11:19:41
16楼: 我只是感觉备注应该是字符串类型,?你可以修改函数声明,?传个Buffer指针试试看
----------------------------------------------
报到
作者:
男 helyna (Person) ▲▲▲▲▲ -
注册会员
2019/8/21 12:07:20
17楼: 需要硬件支持吗?也就是你测试的时候,需要插入IC卡?如果需要的话,没法测试啊
----------------------------------------------
-
作者:
男 helyna (Person) ▲▲▲▲▲ -
注册会员
2019/8/21 12:15:08
18楼: 有特权指令,商家发你的时候,是不是还有其他安装包?这个安装包应该包含驱动程序。
----------------------------------------------
-
作者:
男 qq81709989 (物联网软硬件开发) ▲△△△△ -
注册会员
2019/8/21 13:41:08
19楼: 搭建硬件环境,测试刷卡,AccessPort监听一下串口数据?
----------------------------------------------
Delphi团队承接物联网、智能家居、工业控制等软硬件开发。咨询QQ:81709989
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/21 13:55:32
20楼: to??helyna?:厂家就给了两个dll,两行代码。没有什么安装包。?然后有读卡器和卡,进行测试。只能写好了程序用卡来测试。


to?zhangl?(二黑):
按厂家给的两行代码都是整形的。要如何修改,能麻烦帮忙修改下我的代码。我测试下吗???方便的话能加个微信或者QQ及时向你请教吗?我是25220064,两个同号。谢谢
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 zhangl (二黑) ★☆☆☆☆ -
盒子活跃会员
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;

试一下,?不一定是这里的问题
----------------------------------------------
报到
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/21 14:28:32
22楼: 我试了一下,IcMark定义为字符串类型,编译都无法通过。所以肯定是整形。虽然注释是备注,但信息肯定是数字。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 zhangl (二黑) ★☆☆☆☆ -
盒子活跃会员
2019/8/21 15:06:16
23楼: 编译不过是你写的代码的问题,?贴出来看一下
----------------------------------------------
报到
作者:
男 blacktulip (blacktulip) ★☆☆☆☆ -
盒子活跃会员
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';
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/8/22 10:34:02
25楼: 其实吧,我一直搞不懂为啥会有改人家函数名的欲望。

另外就是,注释是int*并不一定就说明是数值,也许是utf-32编码的字符。这个具体看厂家提供的文档或者说明。

话说,就俩dll,没有示例就算了,连文档都没有??不是什么三无厂家吧?现在这年头了都是买方市场了,你作为给钱的甲方居然被乙方屌成这熊样??
----------------------------------------------
--
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/8/22 11:12:47
26楼: 楼上的只能是猜测。
DLL?的作者最有发言权。结果?作者装死。只给了定义,其他都不给。没辙。
----------------------------------------------
(C)(P)Flying?Wang
作者:
男 codecoolie (CodeCoolie) ▲▲▲▲△ -
注册会员
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
信息
登陆以后才能回复
Copyright ? 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行27.34375毫秒 RSS