DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: szliyu112358
今日帖子: 57
在线用户: 20
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
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代码写得有问题。希望得到指教。翻译一下厂家的两行代码。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 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监听一下串口数据?
----------------------------------------------
《Z-Gantt智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
作者:
男 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 盒子论坛 v3.0.1 版权所有 页面执行148.4375毫秒 RSS