新版外国人永居证身份证读卡器C++开发SDK接口

news/2024/12/30 3:22:52/

近期,国家移民管理局对外国人永久居留身份证(以下简称永居证)进行了升级改造和便利化应用工作,新版永居证将于 2023年 12 月 1 日起正式签发。新版永居证调整了号码规则,改进了信
息储存,优化了图案设计,明确了在民航领域便利化应用事项。此外,新版永居证正式启动签发后,将停止签发 2017 版永居证,既往版本的永居证(含外国人永久居留证、2017 版永居证)在其有效期内仍可正常使用,有效期满后需换发新版永居证。

据相关文件要求,必须更新身份证阅读器机具接口,实现对新版本外国人永居证的读取兼容。

C++读取新版本外国人永居证效果图:

以下是C++实现代码:


void CDonseeTestDlg::OnBnClickedButton19()
{{m_bPhoto = FALSE;CRect r;HDC hDC;HPEN hPen, hPenOld;HBRUSH hBrush, hBrushOld;hDC = ::GetDC(m_Static_Photo.m_hWnd);m_Static_Photo.GetClientRect(&r);hPen = CreatePen(PS_NULL, 0, GetSysColor(COLOR_3DFACE));   // 不带黑边hPenOld = (HPEN)SelectObject(hDC, hPen);hBrush = GetSysColorBrush(COLOR_3DFACE);hBrushOld = (HBRUSH)SelectObject(hDC, hBrush);Rectangle(hDC, r.left+1, r.top+1, r.right-1, r.bottom-1);SelectObject(hDC, hBrushOld);SelectObject(hDC, hPenOld);::ReleaseDC(m_Static_Photo.m_hWnd, hDC);}CWnd *pWnd;pWnd = GetDlgItem(IDC_STATIC_PHOTO);
// 	pWnd->GetWindowRect(m_rtPicShow);
// 	ScreenToClient(m_rtPicShow);m_bPhoto = FALSE; if ((m_isOpenUSB == false) && (m_isOpenCOM == false)){InsertInfo(L"EST-100身份证读卡器连接失败,请先打开USB或者COM端口") ;return ;}char t_arrMsg[256] ;char t_szPicPath[256] = "IDphoto.jpg";CString t_strTemp ;IDINFO idInfo ;memset(&idInfo,0,sizeof(IDINFO)) ;int t_nType = m_Combo5.GetCurSel() ;long t_nRe = Donsee_ReadIDCard(t_nType,t_szPicPath,&idInfo,t_arrMsg) ;if (t_nRe != 0 ){t_strTemp = t_arrMsg ;InsertInfo(L"身份证读取失败:" + t_strTemp) ;return ;}Donsee_Beep();CString strTempA ;CString strInfo ;CString strType ;strType = idInfo.certType ;if (strType == "Y")  //新版本外国人永居证{//中文姓名t_strTemp = idInfo.name ;strTempA.Format(L"中文姓名:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//性别t_strTemp = idInfo.sex ;strTempA.Format(L"性别:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//换证次数t_strTemp = idInfo.certVersion ;strTempA.Format(L"换证次数:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//出生日期t_strTemp = idInfo.birthday ;// 	strTempA.Format(L"    IDINFO.birthday: ");strTempA.Format(L"出生:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//英文姓名,需要和英文姓名备用组合起来才是完整英文姓名t_strTemp = idInfo.ENfullname ;strTempA.Format(L"英文姓名:");strInfo = strTempA;strInfo += t_strTemp ;strInfo += idInfo.Other ;  //英文姓名备用InsertInfo(strInfo);//证件号码t_strTemp = idInfo.number ;strTempA.Format(L"永居证号码:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//起始日期t_strTemp = idInfo.signdate ;strTempA.Format(L"有效期开始:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//截止日期t_strTemp = idInfo.validterm ;// 	strTempA.Format(L"    IDINFO.validterm: ");strTempA.Format(L"有效期结束:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//国籍代码strTempA.Format(L"国籍:");t_strTemp = idInfo.people ;strInfo = strTempA;strInfo += t_strTemp ;strInfo += "/" ;t_strTemp = idInfo.Nationality ;strInfo += t_strTemp ;InsertInfo(strInfo);//当次申请受理机构t_strTemp = idInfo.organs;strTempA.Format(L"当次申请受理机构:");strInfo = strTempA;strInfo += t_strTemp;InsertInfo(strInfo);//证件标识符t_strTemp = idInfo.certType ;strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//既往版本if(strcmp(idInfo.address,"") == 0)InsertInfo(L"既往版本永居证号码:无");else{t_strTemp = idInfo.address;strTempA.Format(L"既往版本永居证号码:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);}}else if (strType == "I")  //2017版外国人永居证{//英文姓名t_strTemp = idInfo.ENfullname ;strTempA.Format(L"英文姓名:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//性别t_strTemp = idInfo.sex ;strTempA.Format(L"性别:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//永久居住号t_strTemp = idInfo.number ;strTempA.Format(L"永居证号码:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//国籍代码strTempA.Format(L"国籍:");t_strTemp = idInfo.people ;strInfo = strTempA;strInfo += t_strTemp ;strInfo += "/" ;t_strTemp = idInfo.Nationality ;strInfo += t_strTemp ;InsertInfo(strInfo);//中文姓名t_strTemp = idInfo.name ;strTempA.Format(L"中文姓名:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//签发日期t_strTemp = idInfo.signdate ;strTempA.Format(L"有效期开始:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//终止日期t_strTemp = idInfo.validterm ;strTempA.Format(L"有效期结束:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//出生日期t_strTemp = idInfo.birthday ;strTempA.Format(L"出生:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//证件版本t_strTemp = idInfo.certVersion ;strTempA.Format(L"证件版本:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//当次申请受理机构t_strTemp = idInfo.organs ;strTempA.Format(L"当次申请受理机构:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//证件标识符t_strTemp = idInfo.certType ;strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);}else if (strType == "J")  //港澳台居民居住证{//姓名t_strTemp = idInfo.name ;strTempA.Format(L"姓名:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//性别t_strTemp = idInfo.sex ;strTempA.Format(L"性别:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//出生日期t_strTemp = idInfo.birthday ;strTempA.Format(L"出生:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//地址t_strTemp = idInfo.address;strTempA.Format(L"住址:");strInfo = strTempA;strInfo += t_strTemp;InsertInfo(strInfo);//证件号码t_strTemp = idInfo.number ;strTempA.Format(L"港澳台居住证号码:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//签发机关t_strTemp = idInfo.organs ;strTempA.Format(L"签发机关:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//起始日期t_strTemp = idInfo.signdate ;strTempA.Format(L"有效期开始:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//截止日期t_strTemp = idInfo.validterm ;strTempA.Format(L"有效期结束:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//通行证号t_strTemp = idInfo.passNu ;strTempA.Format(L"通行证号码:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//签发次数t_strTemp = idInfo.signCount ;strTempA.Format(L"签发次数:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//证件标识符t_strTemp = idInfo.certType ;strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);}else   //strType =="0"  居民身份证{//姓名t_strTemp = idInfo.name ;strTempA.Format(L"姓名:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//性别t_strTemp = idInfo.sex ;strTempA.Format(L"性别:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//民族t_strTemp = idInfo.people ;strTempA.Format(L"民族:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//出生日期t_strTemp = idInfo.birthday ;strTempA.Format(L"出生:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//住址t_strTemp = idInfo.address ;strTempA.Format(L"住址:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//证件号码t_strTemp = idInfo.number ;strTempA.Format(L"身份证号码:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//签发机关t_strTemp = idInfo.organs ;strTempA.Format(L"签发机关:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//起始日期t_strTemp = idInfo.signdate ;strTempA.Format(L"有效期开始:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//截止日期t_strTemp = idInfo.validterm ;strTempA.Format(L"有效期结束:");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);//证件标识符t_strTemp = idInfo.certType ;strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");strInfo = strTempA;strInfo += t_strTemp ;InsertInfo(strInfo);}CString t_str1 , t_str2 ;if (t_nType != 0){t_str2 = idInfo.Photo ;strTempA.Format(L"头像信息1024字节截取50字节显示: ");strInfo = strTempA;strInfo += t_str2.Left(50);strInfo += "...";InsertInfo(strInfo);}if (t_nType == 2){t_str2 = "" ;for (int i = 0 ; i < 1024 ; i ++){t_str1.Format(_T("%02X"),(unsigned char)idInfo.figData[i]) ;t_str2 += t_str1 ;}strTempA.Format(L"指纹信息1024字节截取50字节显示: ");strInfo = strTempA;strInfo += t_str2.Left(50);strInfo += "...";InsertInfo(strInfo);}if (t_nType == 0x00)//此时不需要加载图片return ;int nLeft = m_rtPicShow.left + (m_rtPicShow.right-m_rtPicShow.left)/2 - 102/2;int nTop = m_rtPicShow.top + (m_rtPicShow.bottom-m_rtPicShow.top)/2 - 126/2;pWnd->SetWindowPos( NULL,nLeft,nTop,102,126,SWP_NOZORDER);    //把编辑控件的大小设为(100,80),位置不变HDC hDC;int nWidth;int nHeight;if (!m_imPhoto.IsNull())m_imPhoto.Destroy();m_imPhoto.Load(CString(t_szPicPath));m_bPhoto = TRUE;m_Static_Photo.GetClientRect(&m_rPhoto);hDC = ::GetDC(m_Static_Photo.m_hWnd);nWidth = m_imPhoto.GetWidth();nHeight = m_imPhoto.GetHeight();m_rPhoto.left = (m_rPhoto.Width()-nWidth) / 2;m_rPhoto.right = m_rPhoto.left + nWidth;m_rPhoto.top = (m_rPhoto.Height()-nHeight) / 2;m_rPhoto.bottom = m_rPhoto.top + nHeight;m_imPhoto.Draw(hDC, m_rPhoto);::ReleaseDC(m_Static_Photo.m_hWnd, hDC);// 	InsertInfo(L"获取身份证成功") ;return ;
}


http://www.ppmy.cn/news/1159869.html

相关文章

Selenium - 自动化测试框架

Selenium 介绍 Selenium 是目前用的最广泛的 Web UI 自动化测试框架&#xff0c;核心功能就是可以在多个浏览器上进行自动化测试&#xff0c;支持多种编程语言&#xff0c;目前已经被 google&#xff0c;百度&#xff0c;腾讯等公司广泛使用。 开发步骤 1、配置 google 驱动…

网络工程师知识点5

71、什么是FTP&#xff1f; FTP是文件传输协议。 FTP传输数据时支持两种传输模式&#xff1a;ASCII模式和二进制模式。 需要TCP的21号端口来建立控制连接 需要TCP的20号端口来建立数据连接 72、什么是telnet&#xff1f; Telnet提供了一个交互式操作界面&#xff0c;允许终端远…

IDEA中明明导入jar包了,依旧报ClassNotFoundException

解决办法&#xff1a; 1.点击IDEA右上角的设置 2.点击Project Structure... 3.点击Artifacts,点击号把包添加下就可以了

记一次因为没有关闭 管道导致的内存泄露

原本想探究一下 string(char*) 是移动构造还是复制构造&#xff0c;在测试时发现了意料之外的内存泄露&#xff0c; 找了挺久没有想到哪里&#xff0c;最后发现是管道没有正确关闭&#xff0c;UNIX 系统中一切皆文件&#xff0c;但是 管道这个文件是待在内存中的&#xff0c;不…

性能测试-redis常见问题

缓存击穿、缓存穿透、缓存雪崩 缓存雪崩 解决办法 1.设置缓存失效时间&#xff0c;不要在同一时间 2.redis集群部署 3.不设置缓存设置时间 4.定时刷缓存的时间 缓存穿透 请求不管返回什么数据都返回给redis对参数合法器进行验证&#xff0c;不合法的时候直接过滤掉使用布…

RustDay04------Exercise[01-10]

1.做题须知 这一题告诉我们可以尝试修改下面的输出,在觉得OK之后删除// I AM NOT DONE注释即可进入下一题 // intro1.rs // About this I AM NOT DONE thing: // We sometimes encourage you to keep trying things on a given exercise, even // after you already figured …

基于AT89C52+ADC0809+LCD1602的模数转换实验ptoteus仿真设计

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a; 三、仿真工程&#xff1a; 基于AT89C52ADC0809LCD1602的模数转换实验ptoteus仿真设计资源-CSDN文库

js实现拖拽功能

基于onMouseDown 、onMouseMove 、onMouseUp 使用 mousedown、mousemove 和 mouseup 事件来实现拖拽的基本思路是&#xff1a; 在 mousedown 事件中&#xff0c;开始追踪拖拽操作并记录鼠标按下的位置。 在 mousemove 事件中&#xff0c;根据鼠标的移动&#xff0c;更新被拖拽…