aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 15150|回复: 14

如何正确的调用Dll文件?

[复制链接]

12

主题

39

回帖

310

积分

二级会员

积分
310
发表于 2017-9-28 12:18:01 | 显示全部楼层 |阅读模式
Syn_StartFindIDCard 开始找卡。
int  Syn_StartFindIDCard (
int                          iPort ,
unsigned char *        pucIIN,
int                                iIfOpen
);
参数说明:
iPort
[in] 整数,表示端口号。参见Syn_ResetSAM。
pucIIN
[out] 无符号字符指针,指向读到的IIN。
iIfOpen
[in] 整数,参见Syn_ResetSAM。
返回值:
0                找卡成功
0x80        找卡失败


这个函数的,第二个参数,应该怎么赋值呢?

var dll = ..raw.loadDll("\res\SynIDCardAPI.dll");
dll.Syn_StartFindIDCard(1,这个怎么定义呢,)
看第二个参数是out 返回,应该怎么读取呢?谢谢各位老师

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-9-28 12:53:57 | 显示全部楼层
你这个API函数说明好像是有点问题,
可以找一下他C语言的范例是怎么写的。

unsigned char * 或者  char * 一般对应aardio中的字符串。
如果API是要往这个字符串里写入内容的,那对应的是aardio里的buffer( 缓冲区、字节数组 )

API应当还有一个参数让你告诉API这个buffer有多长,或者是文档里事先告诉你应该分配多大的内存。
假设他规定了需要要250个字节,那么这样写:
var pucIIN = raw.buffer(250);
dll.Syn_StartFindIDCard(1,pucIIN,iIfOpen)
如果他仅仅是返回一个字符串指针(如果这样文档里写的API原型是错的),那么你应该这样写
var pucIIN = { string value}
dll.Syn_StartFindIDCard(1,pucIIN,iIfOpen)

12

主题

645

回帖

3938

积分

荣誉会员

子非魚、安知魚之樂

积分
3938
发表于 2017-9-28 13:35:50 | 显示全部楼层
Jacen.He 发表于 2017-9-28 12:53
你这个API函数说明好像是有点问题,
可以找一下他C语言的范例是怎么写的。


sp20170928_131920_733.png

百度了下 这个是新中新的身份证读卡器SDK
  1. ******************* 身份证卡类API ************************
  2. **********************************************************/
  3. int STDCALL Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);
  4. int STDCALL Syn_SelectIDCard(int iPortID,unsigned char *pucManaMsg,int iIfOpen);
  5. int STDCALL Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);
复制代码


参数:iPort [in] 整数,表示端口号。
pucManaInfo [out] 无符号字符指针,证/卡芯片管理号,4个字节。
iIfOpen [in] 整数

实例BCB代码:
  1.         unsigned char pucIIN[4];
  2.         unsigned char pucSN[8];
  3.         memset(pucIIN,0,4);
  4.         memset(pucSN,0,8);
  5.         ifOpen = 0;
  6.         nRet = Syn_OpenPort( m_iPort );
  7.         if(nRet == 0)
  8.         {
  9.                 Syn_GetSAMStatus(m_iPort,ifOpen);
  10.                 Syn_StartFindIDCard( m_iPort,pucIIN,ifOpen );
  11.                 Syn_SelectIDCard( m_iPort,pucSN,ifOpen );
  12.                 memset(&m_IDCardData,0,sizeof(tagIDCardData));
  13.                 nRet = Syn_ReadMsg( m_iPort,0,&m_IDCardData );
  14.         }
  15.         Syn_ClosePort( m_iPort );
复制代码

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-9-28 14:32:58 | 显示全部楼层
xauto 发表于 2017-9-28 13:35
百度了下 这个是新中新的身份证读卡器SDK

那可以这样写
var pucIIN = raw.buffer(4);
dll.Syn_StartFindIDCard(1,pucIIN,iIfOpen)
或者这样写也可以:
var pucIIN = {BYTE chars[4]};
dll.Syn_StartFindIDCard(1,pucIIN,iIfOpen)
数组指针在aardio中使用结构体表示,
字节数组指针也可以直接用 buffer表示。

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-28 16:51:25 | 显示全部楼层
xauto 发表于 2017-9-28 13:35
百度了下 这个是新中新的身份证读卡器SDK

确实是新中新读身份证的,菜鸟表示还是不会用。

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-28 16:52:02 | 显示全部楼层
Jacen.He 发表于 2017-9-28 14:32
那可以这样写
或者这样写也可以:
数组指针在aardio中使用结构体表示,

多谢Jacen指点,菜鸟还是没搞定。

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-28 16:59:58 | 显示全部楼层
  1. import console;       
  2. var dll = ..raw.loadDll("\res\SynIDCardAPI.dll");
  3. var usbnum=dll.Syn_FindUSBReader(); //寻找USB读卡器,找到端口号
  4. console.log("找到端口号:"+usbnum)

  5. var rtn=dll.Syn_ResetSAM(usbnum,1) //复位,如果是0 说明复位成功
  6. console.log("复位状态:是0表示成功,就不需要open和close函数了====》"+rtn);

  7. var pucIIN = {BYTE chars[4]};
  8. var rtn1=dll.Syn_StartFindIDCard(usbnum,pucIIN,1)
  9. console.dump(rtn1)
复制代码


trn1 就会不动了,也不会输出,不太明白。 下面这个这个函数,读读卡器的基本信息

Syn_USBHIDReadFactoryInfo,读出厂信息
        int Syn_USBHIDReadFactoryInfo(
                int iPort ,
                unsigned char * pFactory,
                unsigned char * pVol,
                unsigned char * pSerialNo,
                unsigned char * pReserved)
        参数说明:
        iPort  [in]整形,读卡器的端口号,可以使用Syn_FindReader获得
        pFactory [out],无符号字节数组,生产厂家
        pVol  [out],无符号字节数组,版本号
        pSerialNo [out],无符号字节数组,生产序号
        pReserved [out],无符号字节数组,生产备注
        返回值:
0        成功


我们注意这个Syn_USBHIDReadFactoryInfo(1001,,,,,) 这个后面的都是输出的,应该是怎么做呢,惆怅,谢谢大神指点。

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-9-28 17:41:31 | 显示全部楼层
muniubuy 发表于 2017-9-28 16:59
trn1 就会不动了,也不会输出,不太明白。 下面这个这个函数,读读卡器的基本信息

调用API时,只要对应的API类型写对了就没有问题。
而API的参数类型是非常少的几个,注意看帮助文档。

unsigned char * 如果API文档说的是一个输出的字节数组,那就可以用 raw.buffer创建字节数组,
前面已经给了你示例,你重复问了一个相同的问题。

一个厂商提供给你的接口,无论你用任何编程语言你都会有惆怅的过程,
因为有一些东西跟编程知识无关,例如你刚才楼顶提出的问题,你连这个参数需要4个字节都没有搞清楚,就再你技术再好你也只能在那里惆怅!

我希望你们在搞技术的时候,把厂商的文档看看清楚,不要把时间花在惆怅来惆怅去上面。
不要又说我教训你们,本来都是一些很简单的问题,力气都花在唉声叹气负面情绪上面,怎么能把事做好。

12

主题

645

回帖

3938

积分

荣誉会员

子非魚、安知魚之樂

积分
3938
发表于 2017-9-28 19:32:23 | 显示全部楼层
muniubuy 发表于 2017-9-28 16:52
多谢Jacen指点,菜鸟还是没搞定。

没有读卡器 爱莫能助[捂脸]

12

主题

645

回帖

3938

积分

荣誉会员

子非魚、安知魚之樂

积分
3938
发表于 2017-9-28 19:36:16 | 显示全部楼层
Snipaste_2017-09-28_19-35-23.png

这个有复制咩?

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-28 20:00:03 | 显示全部楼层
Jacen.He 发表于 2017-9-28 17:41
调用API时,只要对应的API类型写对了就没有问题。
而API的参数类型是非常少的几个,注意看帮助文档。

...

好的,说的好,我继续努力研究一下,对这方面比较理解不上,上次也遇到了,一直没搞清楚。
这次努力研究一下,研究好了,我也要发帖,给论坛做贡献。

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-28 20:00:38 | 显示全部楼层
xauto 发表于 2017-9-28 19:36
这个有复制咩?

这个是什么哦,我从官方 www.onecardok.com.cn下载的里面没有这个。

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-28 20:02:13 | 显示全部楼层
xauto 发表于 2017-9-28 19:36
这个有复制咩?

我看了下 果然有这个啊,估计是我装那个测试程序的时候,它放进去的。

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-29 00:40:42 | 显示全部楼层
http://bbs.aardio.com/forum.php? ... 7&highlight=dll

这个帖子非常的好,非常的好,已经会简单的了,哈哈。

  1. //定义结构体       

  2.         class IDCardData {
  3.             byte Name[32];      //姓名
  4.             byte Sex[6];        //性别
  5.             byte Nation[20];        //名族
  6.             byte Born[18];      //出生日期
  7.             byte Address[72];   //住址
  8.             byte IDCardNo[38];  //身份证号
  9.             byte GrantDept[32]; //发证机关
  10.             byte UserLifeBegin[18]; // 有效开始日期
  11.             byte UserLifeEnd[18];   // 有效截止日期
  12.             byte reserved[38];      // 保留
  13.             byte PhotoFileName[255];// 照片路径
  14.             }
  15. Syn_ReadMsg:=dll.api("Syn_ReadMsg","word(int iPort,int iIfOpen,struct & IDCardData)")
  16. var getData=IDCardData();
  17. result,getData = Syn_ReadMsg(usbnum,1,getData);
复制代码


这种结构体的如何操作呢,读出来都是0

12

主题

39

回帖

310

积分

二级会员

积分
310
 楼主| 发表于 2017-9-29 00:42:33 | 显示全部楼层
http://bbs.aardio.com/forum.php? ... 7&highlight=dll

这个帖子非常的好,非常的好,已经会简单的了,哈哈。

  1. //定义结构体       

  2.         class IDCardData {
  3.             byte Name[32];      //姓名
  4.             byte Sex[6];        //性别
  5.             byte Nation[20];        //名族
  6.             byte Born[18];      //出生日期
  7.             byte Address[72];   //住址
  8.             byte IDCardNo[38];  //身份证号
  9.             byte GrantDept[32]; //发证机关
  10.             byte UserLifeBegin[18]; // 有效开始日期
  11.             byte UserLifeEnd[18];   // 有效截止日期
  12.             byte reserved[38];      // 保留
  13.             byte PhotoFileName[255];// 照片路径
  14.             }
  15. Syn_ReadMsg:=dll.api("Syn_ReadMsg","word(int iPort,int iIfOpen,struct & IDCardData)")
  16. var getData=IDCardData();
  17. result,getData = Syn_ReadMsg(usbnum,1,getData);
复制代码


这种结构体的应该怎么读数据哦,谢谢。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-6-11 00:44 , Processed in 0.070280 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表