近期,国家移民管理局对外国人永久居留身份证(以下简称永居证)进行了升级改造和便利化应用工作,新版永居证将于 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 ;
- }