日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

神思通用100型读身份证

發(fā)布時(shí)間:2024/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神思通用100型读身份证 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前為了能做硬件操作學(xué)習(xí)了C++,一直停留在試驗(yàn)階段。由于之前項(xiàng)目都是HIS做好讀卡對(duì)接了,就直接C#調(diào)HIS的dll了,一直沒實(shí)際用C++對(duì)接過讀卡器。這次終于有了個(gè)讀卡機(jī)會(huì),還有廠商配合,哈哈。

采用C++包裝讀卡操作為一個(gè)讀卡方法如下:

//檢驗(yàn)讀身份證包裝 #include <iostream> #include "windows.h" using namespace std;//讀身份證對(duì)外函數(shù) extern "C" __declspec(dllexport) const char* LISReadIDCard();//方法定義 typedef int(__stdcall* _UCommand1)(unsigned char* pCmd, int* parg0, int* parg1, int* parg2); typedef int(__stdcall* _GetAddr)(char* pbuf); typedef int(__stdcall* _GetBegin)(char* pbuf); typedef int(__stdcall* _GetName)(char* pbuf); typedef int(__stdcall* _GetSex)(char* pbuf); typedef int(__stdcall* _GetSexGB)(char* pbuf); typedef int(__stdcall* _GetFolk)(char* pbuf); typedef int(__stdcall* _GetFolkGB)(char* pbuf); typedef int(__stdcall* _GetIDNum)(char* pbuf); typedef int(__stdcall* _GetDep)(char* pbuf); typedef int(__stdcall* _GetBirth)(char* pbuf); typedef int(__stdcall* _GetEnd)(char* pbuf); typedef int(__stdcall* _GetNewAddr)(char* pbuf); typedef int(__stdcall* _FID_GetEnName)(char* pbuf); typedef int(__stdcall* _FID_GetSex)(char* pbuf); typedef int(__stdcall* _FID_GetSexGB)(char* pbuf); typedef int(__stdcall* _FID_GetIDNum)(char* pbuf); typedef int(__stdcall* _FID_GetNationality)(char* pbuf); typedef int(__stdcall* _FID_GetChNationality)(char* pbuf); typedef int(__stdcall* _FID_GetChName)(char* pbuf); typedef int(__stdcall* _FID_GetBegin)(char* pbuf); typedef int(__stdcall* _FID_GetEnd)(char* pbuf); typedef int(__stdcall* _FID_GetBirth)(char* pbuf); typedef int(__stdcall* _FID_GetVersion)(char* pbuf); typedef int(__stdcall* _FID_GetDep)(char* pbuf); typedef int(__stdcall* _GetSAMIDToStr)(char* id); typedef int(__stdcall* _GID_GetName)(char* pbuf); typedef int(__stdcall* _GID_GetSex)(char* pbuf); typedef int(__stdcall* _GID_GetSexGB)(char* pbuf); typedef int(__stdcall* _GID_GetBirth)(char* pbuf); typedef int(__stdcall* _GID_GetAddr)(char* pbuf); typedef int(__stdcall* _GID_GetIDNum)(char* pbuf); typedef int(__stdcall* _GID_GetDep)(char* pbuf); typedef int(__stdcall* _GID_GetBegin)(char* pbuf); typedef int(__stdcall* _GID_GetEnd)(char* pbuf); typedef int(__stdcall* _GID_GetPassPortId)(char* pbuf); typedef int(__stdcall* _GID_SignCount)(char* pbuf); typedef int(__stdcall* _GID_GetCardType)(char* pbuf); _UCommand1 UCommand1; _GetAddr GetAddr; _GetBegin GetBegin; _GetName GetName; _GetSex GetSex; _GetSexGB GetSexGB; _GetFolk GetFolk; _GetFolkGB GetFolkGB; _GetIDNum GetIDNum; _GetDep GetDep; _GetBirth GetBirth; _GetEnd GetEnd; _GetNewAddr GetNewAddr; _FID_GetEnName FID_GetEnName; _FID_GetSex FID_GetSex; _FID_GetSexGB FID_GetSexGB; _FID_GetIDNum FID_GetIDNum; _FID_GetNationality FID_GetNationality; _FID_GetChNationality FID_GetChNationality; _FID_GetChName FID_GetChName; _FID_GetBegin FID_GetBegin; _FID_GetEnd FID_GetEnd; _FID_GetBirth FID_GetBirth; _FID_GetVersion FID_GetVersion; _FID_GetDep FID_GetDep; _GetSAMIDToStr GetSAMIDToStr; _GID_GetName GID_GetName; _GID_GetSex GID_GetSex; _GID_GetSexGB GID_GetSexGB; _GID_GetBirth GID_GetBirth; _GID_GetAddr GID_GetAddr; _GID_GetIDNum GID_GetIDNum; _GID_GetDep GID_GetDep; _GID_GetBegin GID_GetBegin; _GID_GetEnd GID_GetEnd; _GID_GetPassPortId GID_GetPassPortId; _GID_SignCount GID_SignCount; _GID_GetCardType GID_GetCardType;/// <summary> /// 字符串轉(zhuǎn)寬字符串 /// </summary> /// <param name="orig"></param> /// <returns></returns> LPCWSTR StringToLPCWSTR(std::string orig) {size_t origsize = orig.length() + 1;const size_t newsize = 100;size_t convertedChars = 0;wchar_t* wcstring = (wchar_t*)malloc(sizeof(wchar_t) * (orig.length() - 1));mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);return wcstring; }/// <summary> /// 初始化讀卡 /// </summary> /// <returns>返回空就成功,返回-1^失敗原因</returns> const char* InitFunc() {HINSTANCE hDll = LoadLibraryEx(StringToLPCWSTR("RdCard.dll"), 0, LOAD_WITH_ALTERED_SEARCH_PATH);if (hDll == NULL){return "-1^RdCard.dll加載失敗";}UCommand1 = (_UCommand1)GetProcAddress(hDll, "UCommand1");GetAddr = (_GetAddr)GetProcAddress(hDll, "GetAddr");GetBegin = (_GetBegin)GetProcAddress(hDll, "GetBegin");GetName = (_GetName)GetProcAddress(hDll, "GetName");GetSex = (_GetSex)GetProcAddress(hDll, "GetSex");GetSexGB = (_GetSexGB)GetProcAddress(hDll, "GetSexGB");GetFolk = (_GetFolk)GetProcAddress(hDll, "GetFolk");GetFolkGB = (_GetFolkGB)GetProcAddress(hDll, "GetFolkGB");GetIDNum = (_GetIDNum)GetProcAddress(hDll, "GetIDNum");GetDep = (_GetDep)GetProcAddress(hDll, "GetDep");GetBirth = (_GetBirth)GetProcAddress(hDll, "GetBirth");GetEnd = (_GetEnd)GetProcAddress(hDll, "GetEnd");GetNewAddr = (_GetNewAddr)GetProcAddress(hDll, "GetNewAddr");FID_GetEnName = (_FID_GetEnName)GetProcAddress(hDll, "FID_GetEnName");FID_GetSex = (_FID_GetSex)GetProcAddress(hDll, "FID_GetSex");FID_GetSexGB = (_FID_GetSexGB)GetProcAddress(hDll, "FID_GetSexGB");FID_GetIDNum = (_FID_GetIDNum)GetProcAddress(hDll, "FID_GetIDNum");FID_GetNationality = (_FID_GetNationality)GetProcAddress(hDll, "FID_GetNationality");FID_GetChNationality = (_FID_GetChNationality)GetProcAddress(hDll, "FID_GetChNationality");FID_GetChName = (_FID_GetChName)GetProcAddress(hDll, "FID_GetChName");FID_GetBegin = (_FID_GetBegin)GetProcAddress(hDll, "FID_GetBegin");FID_GetEnd = (_FID_GetEnd)GetProcAddress(hDll, "FID_GetEnd");FID_GetBirth = (_FID_GetBirth)GetProcAddress(hDll, "FID_GetBirth");FID_GetVersion = (_FID_GetVersion)GetProcAddress(hDll, "FID_GetVersion");FID_GetDep = (_FID_GetDep)GetProcAddress(hDll, "FID_GetDep");GID_GetName = (_GID_GetName)GetProcAddress(hDll, "GID_GetName");GID_GetSex = (_GID_GetSex)GetProcAddress(hDll, "GID_GetSex");GID_GetSexGB = (_GID_GetSexGB)GetProcAddress(hDll, "GID_GetSexGB");GID_GetBirth = (_GID_GetBirth)GetProcAddress(hDll, "GID_GetBirth");GID_GetAddr = (_GID_GetAddr)GetProcAddress(hDll, "GID_GetAddr");GID_GetIDNum = (_GID_GetIDNum)GetProcAddress(hDll, "GID_GetIDNum");GID_GetDep = (_GID_GetDep)GetProcAddress(hDll, "GID_GetDep");GID_GetBegin = (_GID_GetBegin)GetProcAddress(hDll, "GID_GetBegin");GID_GetEnd = (_GID_GetEnd)GetProcAddress(hDll, "GID_GetEnd");GID_GetPassPortId = (_GID_GetPassPortId)GetProcAddress(hDll, "GID_GetPassPortId");GID_SignCount = (_GID_SignCount)GetProcAddress(hDll, "GID_SignCount");GID_GetCardType = (_GID_GetCardType)GetProcAddress(hDll, "GID_GetCardType");GetSAMIDToStr = (_GetSAMIDToStr)GetProcAddress(hDll, "GetSAMIDToStr");if (UCommand1 == NULL || GetAddr == NULL || GetBegin == NULL || GetName == NULL || GetSex == NULL || GetSexGB == NULL || GetFolk == NULL || GetFolkGB == NULL || GetIDNum == NULL || GetDep == NULL || GetBirth == NULL || GetEnd == NULL || GetNewAddr == NULL || FID_GetEnName == NULL || FID_GetSex == NULL || FID_GetSexGB == NULL || FID_GetIDNum == NULL || FID_GetNationality == NULL || FID_GetChNationality == NULL || FID_GetChName == NULL || FID_GetBegin == NULL || FID_GetEnd == NULL || FID_GetBirth == NULL || FID_GetVersion == NULL || FID_GetDep == NULL || GetSAMIDToStr == NULL || GID_GetName == NULL || GID_GetSex == NULL || GID_GetSexGB == NULL || GID_GetBirth == NULL || GID_GetAddr == NULL || GID_GetIDNum == NULL || GID_GetDep == NULL || GID_GetBegin == NULL || GID_GetEnd == NULL || GID_GetPassPortId == NULL || GID_SignCount == NULL || GID_GetCardType == NULL){return "-1^RdCard.dll函數(shù)獲取失敗";}return ""; }/// <summary> /// 去除兩邊空白字符 /// </summary> /// <param name="str"></param> /// <returns></returns> char* TrimStr(char* str) {char* head = str;while (*head == ' '){++head;}char* end = head + strlen(head) - 1;while (*end == ' '){--end;}*(end + 1) = 0;strcpy(str, head);return str; }/// <summary> /// 讀身份證方法 /// </summary> /// <returns></returns> const char* LISReadIDCard() {//初始化方法const char* initret = InitFunc();if (initret != ""){return initret;}//連接設(shè)備unsigned char cmd = 0x41;int para0 = 0, para1 = 8811, para2 = 9986;int ret = UCommand1(&cmd, &para0, &para1, &para2);if (ret != 62171){return "-1^設(shè)備連接失敗,請(qǐng)檢查設(shè)備是否插好!";}//驗(yàn)證卡(尋卡)cmd = 0x43;ret = UCommand1(&cmd, &para0, &para1, &para2);//讀卡cmd = 0x49;ret = UCommand1(&cmd, &para0, &para1, &para2);if (ret != 62171 && ret != 62172 && ret != 62173 && ret != 62174){return "-1^讀卡失敗!";}char NameEn[250] = { 0 };char Name[250] = { 0 };char Gender[250] = { 0 };char Nation[250] = { 0 };char BirthDate[250] = { 0 };char Address[250] = { 0 };char IDNumber[250] = { 0 };char SignOrgan[250] = { 0 };char BeginTerm[250] = { 0 };char ValidTerm[250] = { 0 };char NewAddress[250] = { 0 };char PassPortId[250] = { 0 };char SignCount[250] = { 0 };char CardType[250] = { 0 };char CardVersion[250] = { 0 };switch (ret){//二代證case 62171:{GetName(Name);GetSexGB(Gender);GetFolkGB(Nation);GetBirth(BirthDate);GetAddr(Address);GetIDNum(IDNumber);GetDep(SignOrgan);GetBegin(BeginTerm);GetEnd(ValidTerm);GetNewAddr(NewAddress);break;}//二代證帶指紋case 62172:{GetName(Name);GetSexGB(Gender);GetFolkGB(Nation);GetBirth(BirthDate);GetAddr(Address);GetIDNum(IDNumber);GetDep(SignOrgan);GetBegin(BeginTerm);GetEnd(ValidTerm);GetNewAddr(NewAddress);break;}//外國(guó)人case 62173:{FID_GetEnName(NameEn);FID_GetChName(Name);FID_GetSexGB(Gender);if ((unsigned char)Gender[0] == 0xC4 && (unsigned char)Gender[1] == 0xD0){strcat(Gender, " / M");}if ((unsigned char)Gender[0] == 0xC5 && (unsigned char)Gender[1] == 0xAE){strcat(Gender, " / F");}char temp[256] = { 0 };FID_GetChNationality(temp);char temp1[256] = { 0 };FID_GetNationality(temp1);sprintf_s(Nation, "%s / %s", temp, temp1);FID_GetBirth(BirthDate);FID_GetIDNum(IDNumber);strcpy(SignOrgan, "公安部 / Ministry of Public Security");FID_GetBegin(BeginTerm);FID_GetEnd(ValidTerm);char version[32] = { 0 };FID_GetVersion(version);strcpy(CardVersion, version);break;}//港澳臺(tái)case 62174:{GID_GetName(Name);GID_GetSexGB(Gender);GID_GetBirth(BirthDate);GID_GetAddr(Address);GID_GetIDNum(IDNumber);GID_GetDep(SignOrgan);GID_GetBegin(BeginTerm);GID_GetEnd(ValidTerm);GID_GetPassPortId(PassPortId);GID_SignCount(SignCount);GID_GetCardType(CardType);break;}}//關(guān)閉讀卡器cmd = 0x42;UCommand1(&cmd, &para0, &para1, &para2);//組串返回const char* retStr = (string(TrimStr(NameEn)) + "^" + string(TrimStr(Name)) + "^" + string(TrimStr(Gender)) + "^" + string(TrimStr(Nation)) + "^" + string(TrimStr(BirthDate)) + "^" + string(TrimStr(Address)) + "^" + string(TrimStr(IDNumber)) + "^" + string(TrimStr(SignOrgan)) + "^" + string(TrimStr(BeginTerm)) + "^" + string(TrimStr(ValidTerm)) + "^" + string(TrimStr(NewAddress)) + "^" + string(TrimStr(PassPortId)) + "^" + string(TrimStr(SignCount)) + "^" + string(TrimStr(CardType)) + "^" + string(TrimStr(CardVersion))).c_str();return retStr; }/// <summary> /// 以exe編譯時(shí)候測(cè)試的主方法 /// </summary> /// <returns></returns> int main() {string info = LISReadIDCard();cout << info << endl;//停住getchar();return 0; }

該項(xiàng)目先編譯成exe控制臺(tái)測(cè)試可不可以讀身份證。如果控制臺(tái)好使了再編譯成dll供C#調(diào)用。這里碰到一個(gè)坑是我以Debug模式編譯的exe到?jīng)]開發(fā)環(huán)境的電腦就算安裝VC2015運(yùn)行時(shí)還報(bào)錯(cuò)。后面宏偉兄發(fā)現(xiàn)我是Debug編譯導(dǎo)致的。由于之前一直用C#寫,C#的Debug編譯沒影響,所以不知道還要這出(這里要記得以Release模式編譯額)。

然后碰到的問題就是開始C++包裝的方法返回string。然后在C#用String接返回值程序會(huì)崩潰。

這里給C++方法返回改為const char*(即字符串指針),然后C#用IntPtr接指針,然后從指針取字符串?dāng)?shù)據(jù)。

C#包裝如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; using ReadCardService;namespace HLJHYZYYReadCard {public class ReadCard : IReadCard{/// <summary>/// 讀身份證/// </summary>/// <returns></returns>[DllImport("LISReadCard.dll")]public static extern IntPtr LISReadIDCard();/// <summary>/// 讀卡1-就診卡,2-醫(yī)保卡,3-身份證/// </summary>/// <param name="type">卡類型</param>/// <returns></returns>public string Read(string type){IntPtr ret = LISReadIDCard();string str = Marshal.PtrToStringAnsi(ret);if (str.Substring(0, 3) == "-1^"){return "";}str = str.Replace("^","&");return str;}} }

最終把接口實(shí)現(xiàn)配置到公共讀卡程序里,讓程序通過反射加載調(diào)用,程序再模擬條碼槍,就把身份證讀卡模擬為掃碼操作了,界面只要實(shí)現(xiàn)回車事件處理即可。

最終刷一次就等于一次掃碼

總算是把C++和C#結(jié)合用起來了,積累、成長(zhǎng)、堅(jiān)持

總結(jié)

以上是生活随笔為你收集整理的神思通用100型读身份证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。