公司一个项目用到了德卡读卡器的设备,想在原有厂商给的C++ DLL的基础上再做一层封装,方便以后项目的使用,拿来DLL和接口文档就开干了。

在这里记录下,也分享给之后或许有需要的朋友。

要注意的类型转换:

将string转为IntPtr:IntPtr System.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(string)

将IntPtr转为string:string System.Runtime.InteropServices.MarshalPtrToStringAuto(IntPtr)

类型对照:

BSTR ---------  StringBuilder

LPCTSTR --------- StringBuilder

LPCWSTR ---------  IntPtr

handle---------IntPtr

hwnd-----------IntPtr

char *----------string

int * -----------ref int

int &-----------ref int

void *----------IntPtr

unsigned char *-----ref byte

厂家的文档中有关身份证操作的函数分别是:

读明文按键函数short USER_API dc_find_i_d(HANDLE icdev);获取身份证操作句柄函数HANDLE USER_API dc_start_i_d(HANDLE icdev);获取身份证姓名函数
char* USER_API dc_i_d_query_name(HANDLE idhandle); 获取身份证性别函数char* USER_API dc_i_d_query_sex(HANDLE idhandle);获取身份证民族函数char* USER_API dc_i_d_query_nation(HANDLE idhandle);获取身份证出生日期函数char* USER_API dc_i_d_query_birth(HANDLE idhandle);获取身份证住址信息函数char* USER_API dc_i_d_query_address(HANDLE idhandle);获取身份证证件号码函数char* USER_API dc_i_d_query_id_number(HANDLE idhandle);获取身份证签发机关函数char* USER_API dc_i_d_query_id_department(HANDLE idhandle);获取身份证有效期限函数char* USER_API dc_i_d_query_expire_day(HANDLE idhandle);获取身份证照片信息函数short USER_API dc_i_d_query_photo_bmp_buffer(HANDLE idhandle, unsigned char *BmpBuffer, unsigned long *BmpLength);结束读取身份证卡操作函数void  USER_API dc_end_i_d(HANDLE idhandle);

建立项目IDCard,新建GetCardInfo类():

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;namespace IDCard
{public class GetCardInfo{#region 调用dll[DllImport("dcrf32.dll")]private static extern int dc_init(Int16 port, int baud);  //初始化OK[DllImport("dcrf32.dll")]private static extern short dc_find_i_d(int icdev);// 查询身份证卡 [DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_name(int idhandle);//身份证姓名 dc_i_d_query_sex[DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_sex(int idhandle);//性别[DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_nation(int idhandle);//民族[DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_birth(int idhandle);//出生年月[DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_address(int idhandle);//户籍地址[DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_id_number(int idhandle);//身份证号[DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_department(int idhandle);//签发机关     [DllImport("dcrf32.dll")]private static extern IntPtr dc_i_d_query_expire_day(int idhandle);//有效期限[DllImport("dcrf32.dll")]private static extern short dc_i_d_query_photo_bmp_buffer(int idhandle,  byte[] BmpBuffer, ref ulong BmpLength);//照片[DllImport("dcrf32.dll")]private static extern int dc_start_i_d(int icdev);//开始读身份证卡操作 如果=-1表示失败,否则为身份证卡信息标识符。 [DllImport("dcrf32.dll")]private static extern void dc_end_i_d(int idhandle);//结束读取身份证#endregion//int IcDev;//HANDLE icdev:通讯设备标识符IntPtr Mydev;int m_hId;//HANDLE idhandle:身份证卡信息标识符public static int OpenCardReader(){int IcDev;//HANDLE icdev:通讯设备标识符IcDev = dc_init(100, 4800);//usb的pond为100,baud 试验了好多波特率  确定4800可行return dc_find_i_d(IcDev);}/// <summary>读取身份信息</summary>/// <param name="person"></param>/// <param name="ImgPath">图片存储路径</param>/// <returns></returns>public static int getCardInfo(ref PersonInfo person,string ImgPath){try{int IcDev;//HANDLE icdev:通讯设备标识符IntPtr Mydev;int m_hId;//HANDLE idhandle:身份证卡信息标识符IcDev = dc_init(100, 4800);//usb的pond为100,baud 试验了好多波特率  确定4800可行int st = dc_find_i_d(IcDev);//若成功则为0;m_hId = dc_start_i_d(IcDev);//startif ((long)m_hId < 0){return -1;}Mydev = dc_i_d_query_name(m_hId);//姓名person.Name = Marshal.PtrToStringAnsi(Mydev);Mydev = dc_i_d_query_sex(m_hId);//性别person.Sex = Marshal.PtrToStringAnsi(Mydev);Mydev = dc_i_d_query_nation(m_hId);//民族person.Nation = Marshal.PtrToStringAnsi(Mydev);Mydev = dc_i_d_query_birth(m_hId);//出生日期person.Birth = Marshal.PtrToStringAnsi(Mydev);Mydev = dc_i_d_query_address(m_hId);//户籍地址person.Address = Marshal.PtrToStringAnsi(Mydev);Mydev = dc_i_d_query_id_number(m_hId);//身份证号person.IdNumber = Marshal.PtrToStringAnsi(Mydev);Mydev = dc_i_d_query_department(m_hId);//签发机关person.IdDepartment = Marshal.PtrToStringAnsi(Mydev);Mydev = dc_i_d_query_expire_day(m_hId);//有效期限person.ExpireDay = Marshal.PtrToStringAnsi(Mydev);if (!string.IsNullOrEmpty(ImgPath)){byte[] bmp_buffer = new byte[204800];ulong bmp_len = 204800;short pic = 0;pic = dc_i_d_query_photo_bmp_buffer(m_hId, bmp_buffer, ref bmp_len);//照片MemoryStream ms = new MemoryStream(bmp_buffer);Image outputImg = Image.FromStream(ms);person.Photo = outputImg;//outputImg.Save(ImgPath + "\\{0}.jpg", person.Name);outputImg.Save(ImgPath);}dc_end_i_d(m_hId);//end}catch (Exception ex){//throw ex;return -1; }return 1;}}
}

实体类PersonInfo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;namespace IDCard
{public class PersonInfo{private string name;/// <summary>姓名</summary>public string Name{get { return name; }set { name = value; }}private string sex;/// <summary>性别</summary>public string Sex{get { return sex; }set { sex = value; }}private string nation;/// <summary>民族</summary>public string Nation{get { return nation; }set { nation = value; }}private string birth;/// <summary>出生年月日</summary>public string Birth{get { return birth; }set { birth = value; }}private string address;/// <summary>户籍地址</summary>public string Address{get { return address; }set { address = value; }}private string idNumber;/// <summary>身份证号</summary>public string IdNumber{get { return idNumber; }set { idNumber = value; }}private string idDepartment;/// <summary>签发机关</summary>public string IdDepartment{get { return idDepartment; }set { idDepartment = value; }}private string expireDay;/// <summary>有效期限</summary>public string ExpireDay{get { return expireDay; }set { expireDay = value; }}private Image photo;/// <summary>照片</summary>public Image Photo{get { return photo; }set { photo = value; }}}
}

在使用时只需要给实体类传参进去就OK了:

 private void button1_Click(object sender, EventArgs e){PersonInfo person = new PersonInfo();int result = IDCard.GetCardInfo.getCardInfo(ref person, "C:\\chen.jpg");textBox1.Text = person.Name;textBox2.Text = person.Sex;textBox3.Text = person.Birth;textBox4.Text = person.Address;textBox5.Text = person.IdDepartment;textBox6.Text = person.ExpireDay;textBox7.Text = person.Nation;textBox8.Text = person.IdNumber;picPerson.Image = person.Photo;}

C#调用C++DLL 使用 德卡 读卡器 获取身份证信息相关推荐

  1. 荒野行动为什么不能获取服务器信息,荒野行动卡在获取服务器信息上了怎么办?(附解决方法)...

    众所周这款游戏是一款新出的手游,虽然玩法比较吸引大家,但是总有许许多多的BUG所存在,那么荒野行动获取服务器信息卡住应该很多玩家都遇到了吧?下面由我带给大家荒野行动获取服务器信息卡住的解决方案 荒野行 ...

  2. C#使用读卡器读取身份证信息(包含物理卡号)

    说明:本人用的是精伦身份证阅读器idr210 免驱 摘要:目前市面上读取身份证技术已经很成熟了,大多数文章都介绍了读取身份证的详细信息,但是这些信息里并不包含身份证的物理卡号,所以本文讲解的重点在读取 ...

  3. 基于华视身份证读卡器读取身份证信息的Android demo

    项目概述 本Demo需要华视的身份证读卡器,连接Android机器设备,当身份证读卡器读取到身份证信息后,立马展示出身份证信息数据.得到身份证的姓名.照片.出生年月等数据. 项目概述 本Demo需要华 ...

  4. 荒野行动pc版卡在获取服务器信息,《荒野行动》PC版更新卡在获取引擎信息 更新引擎卡住等解决方法...

    导 读 荒野行动PC版在12月21日迎来圣诞节超大更新,相信很多玩家都迫不及待的打开电脑准备更新.但是在更新PC版的时候却发现卡在了获取引擎信息上.小熊整理了目前收集到的一些情况和解决办法,包括更新引 ...

  5. Python调用ansible API系列(一)获取资产信息

    你想让ansible工作首先就需要设置资产信息,那么我们如何通过使用Python调取Ansible的API来获取资产信息呢? 要提前准备一个hosts文件 获取组或者主机 #!/usr/bin/env ...

  6. 一梦江湖卡在获取服务器信息,一梦江湖小技巧,不氪金,卡级玩家怎么获取资源提升修为...

    一梦江湖已经出了不少时候了,很多玩法都被人们挖掘出来了,有卡在一个等级,通过论剑或者逐鹿战场来获得游戏体验的,卡级的好处在于,每天完成的任务少,不需要多么去肝,并且这个等级需要的资源也不多,对于修为要 ...

  7. 天下手游卡在获取服务器信息,天下手游召唤兽获取与洗练:新手必须知道的事情...

    原标题:天下手游召唤兽获取与洗练:新手必须知道的事情 天下手游召唤兽获取与洗练,新手必须知道的事情.对于许多老司机来说,这些东西已经是十分熟悉的东西.不过小羊在召唤兽这方面的解说主要是对于小白玩家来说 ...

  8. 天下手游卡在获取服务器信息,天下手游军资获取方法 获取和使用经验分析

    今天发号网和大家讲解天下手游军资获取方法 获取和使用经验分析 天下手游军资怎么获取?有哪些获取方法呢?下面就分享天下手游军资获取和使用经验分析给大家,希望这篇攻略对小伙伴们有所帮助. 军资: 军资的获 ...

  9. 楚留香手游卡在获取服务器信息,楚留香手游PC版一直在检验本地资源怎么办_楚留香手游PC版检查100%不动解决办法_玩游戏网...

    <楚留香>手游被通缉解除方法 在<楚留香>手游中,很多玩家会因为一些原因被通缉,这是很正常的事情,只要知道如何解除通缉就好,当然这个对于很多玩家来说是不清楚的,下面就让玩游网小 ...

最新文章

  1. PL/SQL编程:用while-loop-end循环算出5的阶乘
  2. python测试开发自学教程-测试开发学习路线图
  3. RESTful Web 服务 - 消息
  4. Mysql数据库(七)——mysql高阶语句(上)
  5. jmeter多用户登录跨线程组操作传值
  6. 理解依赖注入(IOC)和学习Unity
  7. linux bash命令_Ultimate Linux命令行指南-Full Bash教程
  8. [html] 你认为Html的术难点在哪?
  9. 前端学习(219):css伪类选择器
  10. 五种线程池的对比与使用
  11. libsvm java下载_一个基于LIBSVM(JAVA)的股票预测demo
  12. x220linux蓝牙驱动,ThinkPad X230 Bluetooth 蓝牙驱动程序下载(Windows 7/Vista)
  13. matlab线型与颜色
  14. 巴蜀1471 魔兽争霸
  15. java3d室外场景构建_3dmax里怎么渲染室外场景
  16. python语言中的转义字符_怎么使用Python转义字符
  17. C# 实验五 银行系统
  18. 校园二手交易平台-程序流程图
  19. AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、DETR、ViT/Swin transformer
  20. 线索二叉树的前序遍历

热门文章

  1. html中四栏之间距离怎么调成,等宽两栏怎么设置(等宽两栏格式怎么设置)
  2. uni-App聊天功能的源码
  3. 2022年安徽省机器人大赛——程序设计赛道 第十三届安徽省大学生程序设计大赛————I 玩捉迷藏
  4. 信息安全与网络安全的异同点
  5. uniapp push 推送 个推 安卓Android添加Google 推送服务 FCM 离线推送 Dcloud
  6. spring-data-elasticsearch @Field注解无效的解决方案
  7. SQL常用的内置函数
  8. JAVA ssh2+maven带财务进销存ERP
  9. 航天信息Aisino SK-805 打印机驱动
  10. HBuilderX解压后无法安装插件提示“插件下载失败,请检查网络”的解决办法