



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#读取二代身份证信息源码usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.Reflection;usingSystem.IO;namespaceICCard(publicclasscisICCard(〃首先,声明通用接口[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_OpenPort(intiPortID);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_ClosePort(intiPortlD);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_PowerManagerBegin(intiPortID,intilfOpen);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_AddSAMUser(intiPortID,stringpclIserName,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_SAMLogout(intiPortID,intilfOpen);[DlllmportCsdt叩i.dll')]publicstaticexternintSDT_UserManagerOK(intiPortID,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_ChangeOwnPwd(intiPortID,stringpcOldPasswd,stringpcNewPasswd,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_ChangeOtherPwd(intiPortID,stringpcUserName,stringpcNewPasswd,intilfOpen);[Dlllmport(*sdtapi.dir)]publicstaticexternintSDT_DeleteSAMUser(intiPortID,stringpclIserName,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_StartFindIDCard(intiPortID,refintpucllN,intilfOpen);[DlllmportCsdt叩i.dlり]publicstaticexternintSDT_SelectlDCard(intiPortID,refintpucSN,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_ReadBaseMsg(intiPortID,stringpucCHMsg,refintpuiCHMsgLen,stringpucPHMsg,refintpuiPHMsgLen,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_ReadBaseMsgToFile(intiPortID,stringfileNamel,refintpuiCHMsgLen,stringfileName2,refintpuiPHMsgLen,intilfOpen);publicstaticexternintSDT_WriteAppMsg(intiPortID,refbytepucSendData,intuiSendLen,refbytepucRecvData,refintpuiRecvLen,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_WriteAppMsgOK(intiPortID,refbytepucData,intuiLen,intilfOpen);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_CancelWriteAppMsg(intiPortID,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_ReadNewAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_ReadAIIAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_UsableAppMsg(intiPortID,refbyteucByte,intilfOpen);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_GetUnlockMsg(intiPortID,refbytestrMsg,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_GetSAMID(intiPortID,refbyteStrSAMID,intilfOpen);[DlllmportCsdtapi.dll1)]publicstaticexternintSDT_SetMaxRFByte(intiPortID,byteucByte,intilfOpen);[DlllmportCsdtapi.dll')]publicstaticexternintSDT_ResetSAM(intiPortID,intiIfOpen);<Ahref="/M>PDA</A>[DIIImportCWItRS.dir)]publicstaticexternintGetBmp(stringfile_name,intintf);publicdelegatevoidDe_ReadlCCardComplete(clsEDZobjEDZ);publiceventDe_ReadlCCardCompleteReadICCardComplete;privatecIsEDZobjEDZ=newclsEDZ();privateintEdzilfOpen=1; 〃自动开关串口intEdziPortID;publicclslCCard()()publicboolReadlCCard()(boolbUsbPort=false;intintOpenPortRtn=0;intrtnTemp=0;intpucllN=0;intpucSN=0;intpuiCHMsgLen=0;intpuiPHMsgLen=0;objEDZ=newclsEDZ();〃检测usbロ的机具连接,必须先检测usbfor(intiPort=1001;iPort<=1016;iPort++)if(intOpenPortRtn==144)EdziPortID=iPort;bllsbPort=true;break;)}〃检测串口的机具连接if(IbUsbPort)(for(intiPort=1;iPort<=2;iPort++)(intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn==144){EdziPortID=iPort;bllsbPort=false;break;MessageBox.ShowC端口打开失败,请检测相应的端口或者重新连接读卡器!,,‘提示’,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;)〃在这里,如果您想下一次不用再耗费检査端口的检査的过程,您可以把EdziPortID保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,〃您要考虑机具连接端口被用户改变的情况哦〃下面找卡rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);if(rtnTemp!=159)(rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);〃再找卡if(rtnTemp!=159)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.ShowC未放卡或者卡未放好,请重新放卡!’,,提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;))〃选卡rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);if(rtnTemp!=144)rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);〃再选卡if(rtnTemp!=144)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show(‘读卡失败!‘,‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;))〃注意,在这里,用户必须有应用程序当前目录的读写权限〃检测串口的机具连接if(IbUsbPort)(for(intiPort=1;iPort<=2;iPort++)(intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn==144)(EdziPortID=iPort;bllsbPort=false;break;if(intOpenPortRtn!=144)(MessageBox.Show(‘端口打开失败,请检测相应的端口或者重新连接读卡器!‘,‘提示’,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;}〃在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,〃您要考虑机具连接端n被用户改变的情况哦〃下面找卡rtnTemp=SDT_StartFindIDCard(EdziPortID,refpucllN,EdzilfOpen);<Ahref="http:〃/”>身份证读卡器v/A>if(rtnTemp!=159)(rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);〃再找卡if(rtnTemp!=159)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Showぐ未放卡或者卡未放好,请重新放卡!し’提示。,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;〃选卡rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);if(rtnTemp!=144)(rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen)i〃再选kif(rtnTemp!=144){rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show(’读卡失败!‘,‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;))〃注意,在这里,用户必须有应用程序当前冃录的读写权限FileinfoobjFile=newFilelnfo(,wz.txt');if(objFile.Exists)(objFile.Attributes=FileAttributes.Normal;objFile.Delete();)objFile=newFilelnfo('zp.bmp*);if(objFile.Exists)objFile.Attributes=FileAttributes.Normal;objFile.Delete();)objFile=newFilelnfo(*zp.wlt);if(objFile.Exists)(objFile.Attributes=FileAttributes.Normal;objFile.Delete();)rtnTemp=SDT_ReadBaseMsgToFile(EdziPortlD,*wz.txt*,refpuiCHMsgLen,*zp.wlt\refpuiPHMsgLen,EdzilfOpen);if(rtnTemp!=144)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show(‘读卡失败!‘,‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;)〃下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,照片解析将会失败if(bUsbPort)rtnTemp=GetBmp('zp.wlt,2);elsertnTemp=GetBmp('zp.wlt',1);switch(rtnTemp)case0:MessageBox.Show('调用sdtapi.dl!错误!‘,‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);break;〃正常break;case-1:MessageBox.Showぐ相片解码错误!‘,‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-2:MessageBox.Show(,wlt文件后缀错误!‘,’提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-3:MessageBox.Show('wlt文件打开错误!‘,’提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-4:MessageBox.Show('wlt文件格式错误!',’提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-5:MessageBox.Show('软件未授权!‘,‘提示',MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-6:MessageBox.Show。设备连接错误!二’提示,,MessageBoxButtons.OK,MessageBoxIcon.Error);break;)rtnTemp=SDT_ClosePort(EdziPortID);Fileinfof=newFilelnfo('wz.txt');FileStreamfs=f.OpenRead();byte[]bt=newbyteffs.Length];fs.Read(bt,0,(int)fs.Length);fs.Close();stringstr=System.Text.UnicodeEncoding.Unicode.GetString(bt);objEDZ.Name=System.Text.UnicodeEncoding.Unicode.GetString(bt,0,30).Trim();objEDZ.Sex_Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,30,2).Trim();objEDZ.NATION_Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,32,4).Trim();stringstrBird=System.Text.UnicodeEncoding.Unicode.GetString(bt,36,16).Trim();objEDZ.BIRTH=Convert.ToDateTime(strBird.Substring(0,4)+‘年'+strBird.Substring(4,2)+'月'+strBird.Substring(6)+‘日');objEDZ.ADDRESS=System.Text.UnicodeEncoding.Unicode.GetString(bt,52,70).Trim();objEDZ.lDC=System.Text.UnicodeEncoding.Unicode.GetString(bt,122,36).Trim();objEDZ.REGORG=System.Text.UnicodeEncoding.Unicode.GetString(bt,158,30).Trim();stringstrTem=System.Text.UnicodeEncoding.Unicode.GetString(bt,188,bt.GetLength(O)-188).Trim();objEDZ.STARTDATE=Convert.ToDateTime(strTem.Substring(0,4)+’年,+strTem.Substring(4,2)+'月'+strTem.Substring(6,2)+•日');strTem=strTem.Substring(8);if(strTem.Trim()!=’长期’)objEDZ.ENDDATE=Convert.ToDateTime(strTem.Substring(0,4)+,年‘+strTem.Substring(4,2)+‘月'+strTem.Substring(6,2)+甘);)else{objEDZ.ENDDATE=DateTime.MaxValue;)objFile=newFilelnfo('zp.bmp');if(objFile.Exists)(Imageimg=Image.FromFile(*zp.bmp4);objED乙PIC_lmage=(lmage)img.Clone();System.lO.MemoryStreamm=newMemoryStream();img.Save(m,System.Drawing.Imaging.ImageFormat.Jpeg);objEDZ.PIC_Byte=m.ToArray();img.Dispose();img=null;)ReadlCCardComplete(objEDZ);returntrue;publicclasscIsEDZ{privateSystem.Collections.SortedListIstMZ=newSortedList();privatestring_NameI〃姓名privatestring_Sex_Code; 〃性别代码privatestring_Sex_CName;〃性别privatestring_IDC;〃身份证号码privatestring_NATION_Code;〃民族代码privatestring_NATION_CNameJ〃民族privateDateTime_BIRTHJ〃出生日期privatestring_ADDRESS;〃住址privatestring_REGORGJ 〃签发机关privateDateTime.STARTDATE; 〃身份证有效起始日期privateDateTime_ENDDATE; 〃身份证有效截至日期privatestring_Period_Of_Validity=Code; 〃有效期限代码,许多原来系统上面为了一代证考虑,常常存在这样的字段,二代证中已经没有了privatestring_Period_Of_Validity_CName; 〃有效期限privatebyte[]_PIC_Byte; 〃照片二进制privateImage_PIC_lmage;〃照片publicclsEDZ()lstMZ.Add('O2「蒙占族’);IstMZ.Addg‘回族');lstMZ.Add(X)4',‘藏族');IstMZ.Addg‘维吾尔族');lstMZ.Add('O6','苗族');lstMZ.Add(l07','彝族');lstMZ.Add('O8',‘壮族’);lstMZ.Add('O9','布依族');IstMZ.Add"。','朝鲜族');lstMZ.Add('11‘,’满族');lstMZ.Add"2',‘侗族');lstMZ.Add('13','瑶族');lstMZ.Add('14「白族');lstMZ.Add(l15','土家族');lstMZ.Add(*16','哈尼族');IstMZ.Add“ア,‘哈萨克族');lstMZ.Add('18','傣族');lstMZ.Add”9','黎族');lstMZ.Add('2O','傑傑族');lstMZ.AddC21''仮族');lstMZ.Add(23「高山族);lstMZ.Add(24「拉祜族);lstMZ.Add(25「水族);IstMZ.Add(26「东乡族);lstMZ.Add(27「纳西族);IstM乙Add(,28「景颇族);lstMZ.Add(29「柯尔克孜族);lstMZ.Add('3O「土族);lstMZ.Add('31「达翰尔族);lstMZ.Add('32「イ么佬族);lstMZ.Add(33「羌族);lstMZ.Add('34「布朗族);lstMZ.Add('35「撒拉族);lstMZ.Add(36「毛南族,);lstMZ.Add('37「化佬族);lstMZ.Add(38「锡伯族);lstMZ.Add('39「阿昌族);lstMZ.Add(40「普米族);lstMZ.Add(41「塔吉克族);lstMZ.Add(42「怒族);lstMZ.Add('43「乌孜别克族);IstMZ.Add('44「俄罗斯族);lstMZ.Add('46',‘德昂族’);lstMZ.Add('47',‘保安族');lstMZ.Add('48','裕固族');lstMZ.Add('49',‘京族');lstMZ.Add('5O','塔塔尔族');lstMZ.Add('51','独龙族’);lstMZ.Add('52',‘鄂伦春族');lstMZ.Add('53','赫哲族');lstMZ.Add('54',•门巴族');lstMZ.Add('55','珞巴族');lstMZ.Add('56','基诺族');lstMZ.Add('57','其它');lstMZ.Add('98','タト国人入籍');)publicstringName(get{return_Name;}set{_Name=value;})publicstringSex_Codeset_Sex_Code=value;switch(value)(case*1*:Sex_CName=身;break;Sex_CName='女’;break;)))publicstringSex_CName(get{return_Sex_CName;}set{_Sex_CName=value;})publicstringIDCget{return_IDC;}set{_IDC=value;})publicstringNATION_Code(get{return_NATION_Code;}set(_NATION_Code=value;if(IstM乙Contains(value))NATION_CName=lstMZ[value].ToString();))publicstringNATION_CName(get{return_NATION_CName;}set{_NATION_CName=value;})publicDateTimeBIRTH(get{return_BIRTH;}set{_BIRTH=value;}publicstringADDRESSget{return_ADDRESS;}set{_ADDRESS=value;}}publicstringREGORG(get{return_REGORG;}set{_REGORG=value;}}publicDateTimeSTARTDATE(get{return_STARTDATE;}set{_STARTDATE=value;})publicDateTimeENDDATE(get{return_ENDDATE;}set(_ENDDATE=value;if(_ENDDATE==DateTime.MaxValue)_Period_OLValidity_Code=3;_Period_Of_Validity_CName='长期’;)else(if(_STARTDATE!=DateTime.MinValue)(switch(value.AddDays(1).Year-_STARTDATE.Year)(case5:_Period_Of_Validity_Code=4;_Period_Of_Validity_CName='5年’;break;case10:_Period_Of_Validity_Code=T;_Period_Of_Validity_CName="。年,;break;case20:_Period_Of_Validity_Code=2;_Period_Of„Validity_CName=*20年’;break;})))publicstringPeriod_Of_Validity_Code(get{return_Period_Of_Validity_Code;}set{_Period_Of_Validity_Code=value;})publicstringPeriod_Of_Validity_CName(get{return_Period_Of_Validity_CName;}set{_Period_Of_Validity_CName=value;})publicbyte[]PIC_Byte(get{return_PIC_Byte;}set{_PIC_Byte=value;})publicImagePIC_lmageget{return_PIC_lmage;}set{_PIC_lmage=value;}))[转载]二代身份证读卡器接口函数Delphi声明(2010-06-3022:09:33)转载原文标签:转载原文地址:二代身份证读卡器接n函数Delphi声明作者:虚伪人牛.前段时间做项目时用的,拿来ー看全是C++的dll,就对应写了一下Delphi的声明查看串口当前波特率functionSDT_GetCOMBaud(iPort:integer;puiBaudRate:Pinteger):integer;stdcall;External'SDTAPI.DLL";{iPort[in]表示端口,puiBaudRate[out]无符号指针,指向普通串口当前波特率,返回值0X90一成功,0x1一端口打开失败/端口号不合法,0x5无法获得SAM_V的波特率,串口不可用。}设置SAMV的串口的波特率functionSDT_StetCOMBaud(iPort:integer;uiCurrBaud:integer;uiSetBaud:integer):integer;stdcall;External'SDTAPI.DLL';<Ahref=*/">手持终端</A>{iPort[in]表示端口,uiCurrBaud[in]调用改API前已设置的业务终端与SAMV通信的波特率(出厂默认为115200)uiCurrBaud只能为11520〇,57600,378400,19200,9600。如果uiCurrBaud数值不是这些值之一,函数返回0x21,如果和已设置的不一样,函数返回0x02表示不能设置调用AP!不成功。uiSetBaud[in]将要设置的SAM_V波特率,只能为(同上)那些值,如果不是这些数值,返回也同上函数返回0x90一成功,0x1一端口打开失败/端口号不合法,0x2-超时,设置不成功,0x21-uiCurrBaud,uiSetBaud输入参数数值错误}打开串口/USBfunctionSDTOpenPort(iPort:integer):integer;stdcall;External1SDTAPLDLL,;{iPort[in]表示端口号,1-16(十进制)为串口,1001-1016(十进制)为USBロ,缺省的ー个USB设备端口是1001o函数返回0x90一打开端口成功,1ー打开端口失败/端口号不合法}关闭串口/USBfunctionSDTClosePort(iPort:integer):integer;stdcall;External'SDTAPLDLL';{iPort[in]表示端口号,返回值0x90ー关闭串口成功,0x01一端口号不合法}对SAM_V复位functionSDT_ResetSAM(iPort:integer;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口号,目前串口和USB只支持16个,串口:0001-0016,USB:1001-1016。ilfOpen[in]表示不在该函数内部打开和关闭串口,非〇表示在API函数内部包含了打开串口和关闭串口函数,之前不需要调用SDT_OpenPort和SDT_ClosePort返回值0x90ー成功,其他失败}设置射频适配器最大通信字节数functionSDTSetMaxRFByte(iPort:integer;ucByte:Char;blf0pen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口号,ucByte[in]无符号字符,24-255,表示射频适配器最大通信字节数,ilf0pen[in]参见SDT_ResetSAM返回值0x90ー成功,其他一失败}对SAMV进行状态检测functionSDT_GetSAMStatus(iPort:integer;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口号,ilfOpen参见SDT_ResetSAM返回值0x90-SAMV正常,0x60一自检失败,不能接收命令,其他-命令失败}读取SAMV的编号functionSDT_GetSAMID(iPort:integer;pusSAMID:Pbyte;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口号,pusSAMID[out]无符号字符串指针SAM_V编号,16字节,返回值0x90ー成功,其他一失败}读取SAM_V的编号functionSDT_GetSAMIDToStr(iPort:integer;pcSAMID:Pbyte;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iport[in]表示端口号,pusSAMID[out]SAM_V编号,ilf0pen[in]整数,参见SDT_ResetSAM返回值0x90ー成功,其他一失败}开始找卡functionSDT_StartFindIDCard(iPort:integer;pucManalnfo:Pbyte;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iport[in]表示端口号,pucManalnfo[out]无符号指针,证/卡芯片管理号,4个字节,ilf0pen[in]参见SDT_ResetSAM返回值0x9fー找卡成功,0x80ー找卡失败}选卡functionSDTSelectIDCard(iPort:integer;pucManaMsg:Pbyte;iIfOpen:integer):integer;stdcall;External,SDTAPLDLL,;{iPort[in]表示端口号,pucManaMsg[out]无符号指针,证/卡芯片序列号,8个字节,ilfOpen[in]参见SDT_ResetSAM返回值0x90ー选卡成功,0x81ー选卡失败}读取卡体管理号functionSDTReadMnglnfo(iPort:integer;pucManageMsg:Pbyte;ilfOpen:integer):integer;stdcal1;External,SDTAPLDLL,;{iPort[in]表示端口号,pucManageMsg[out]无符号字符指针,卡体管理号,28字节,ilfOpen[in]返回值0x90ー成功,其他ー读失败}读取证/卡固定信息functionSDTReadBaseMsg(iPort:integerjpucCHMsg:Pbyte;puiCHMsgLen:Pinteger;pucPHMsg:Pbyte;puiPHMsgLen:Pinteger;ilfOpen:integer):integer;stdcal1;External,SDTAPLDLL,;{iPort[in]表示端口号,pucCHMsg[out]指向读到的文字信息,puiCHMsgLen[out]指向读到的文字信息长度pucPHMsg[out]指向读到的照片信息,puiPHMsgLen[out]指向读到的照片信息长度,ilfOpen[in]参见SDT_ResetSAM返回值0x90ー读固定信息成功,其他读固定信息失败}读取追加信息functionSDTReadNewAppMsg(iPort:integer;pucAppMsg:Pbyte;puiAppMsgLen:Pinteger;ilfOpen:integer):integer;;stdcal1;External,SDTAPLDLL,;{iPort[in]表示端口号,pucAppMsg[out]指向读到的追加信息,puiAppMsgLen[out]指向读到的追加信息长度,ilfOpen[in]参见SDT_ResetSAM返回值0x90ー读取追加信息成功,其他ー读取追加信息失败}照片解码函数functionGetBmp(Wlt_File:PChar,intf:integer):integer;stdcal1;External*WltRS.dll,;{Wlt_File-wlt文件名,intf阅读设备通讯接口类型(1-RS-232C,2-USB)返回值:生成・.bmp和以下返回信息:厂相片解码正确,〇ー调用sdtapi.dll错误「1ー相片解码错误,-2-wlt文件后缀错误,-3-wlt文件打开错误,-4-wit文件格式错误,-5ー软件未授权,-6ー设备连接错误}不同机具的通用的第二代居民身份证读写C#2008-06-0615:19:47阅读46评论1'?号:厶中小订阅公安部已经大规模在全国范围内推广第二代居民身份证的换发工作,目前,许多地区二代证换发工作已经进行了很久。但是,相对应于二代证的推广,社会上许许多多的应用系统都还没有对二代证读卡开发相应的接口,为此,我写了一个通用的二代证机具读卡类,希望能对各位在各自的系统中开发这样的接口提供帮助。本类仅仅提供读卡的用法,写卡的方式我并没有写在里面,但是,相应的写调用我已经声明在里面,希望各位大侠能独自研究应用。芻该类接口具有如下特点:1、通用于目前市场上各个机具厂商的二代证读(写)机具。(想想,为不同厂商开发不同的接口确实令人头疼的,且由于接口不兼容,容易被客户骂死!#)2、自动适应串口、USB口的各种机具3、能读文字信息,但是,要想正确读照片,必须需要机具厂商的授权文件Termb.Lic,且授权文件必须放在C盘根目录下。(我总不能不照顾机具厂商的利益吧和)4、除了上面第三条之外,您甚至不用安装机具的驱动程序,接上二代证机具即可使用。废话少说,下面看实现方法:类如下:usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.Reflection;usingSystem.IO;namespaceICCard(publicclassclsICCard(〃首先,声明通用接口[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_OpenPort(intiPortID);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ClosePort(intiPortID);[Dlllmport(,,sdtapi.dll,^)]publicstaticexternintSDT_PowerManagerBegin(intiPortID,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_AddSAMUser(intiPortID,stringpcUserName,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_SAMLogin(intiPortID,stringpcUserName,stringpcPasswd,intiIfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_SAMLogout(intiPortID,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_UserManagerOK(intiPortID,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ChangeOwnPwd(intiPortID,stringpcOldPasswd,stringpcNewPasswd,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_ChangeOtherPwd(intiPortID,stringpcUserName,stringpcNewPasswd,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_DeleteSAMUser(intiPortID,stringpcUserName,intilfOpen);[DlllmportC'sdtapi.dll")]publicstaticexternintSDT_StartFindlDCard(intiPortID,refintpucllN,intilfOpen);[Dlllmport(,,sdtapi.dll,^)]publicstaticexternintSDT_SelectlDCard(intiPortID,refintpucSN,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ReadBaseMsg(intiPortID,stringpucCHMsg,refintpuiCHMsgLen,stringpucPHMsg,refintpuiPHMsgLen,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ReadBaseMsgToFile(intiPortID,stringfileNamel,refintpuiCHMsgLen,stringfileName2,refintpuiPHMsgLen,intilfOpen);[Dlllmport(Msdtapi.dll")]publicstaticexternintSDT_WriteAppMsg(intiPortID,refbytepucSendData,intuiSendLen,refbytepucRecvData,refintpuiRecvLen,intilfOpen);[DlllmportC^dtapi.dir')]publicstaticexternintSDT_WriteAppMsgOK(intiPortID,refbytepucData,intuiLen,intilfOpen);[DlllmportC^dtapi.dll")]publicstaticexternintSDT_CancelWriteAppMsg(intiPortID,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ReadNewAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport(',sdtapi.dll,^)]publicstaticexternintSDT_ReadAIIAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport(,,sdtapi.dll,^)]publicstaticexternintSDT_UsableAppMsg(intiPortID,refbyteucByte,intilfOpen);[Dlllmport(Msdtapi.dll")]publicstaticexternintSDT_GetUnlockMsg(intiPortID,refbytestrMsg,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_GetSAMID(intiPortID,refbyteStrSAMID,intilfOpen);[DlllmportCsdtapi.dll")]publicstaticexternintSDT_SetMaxRFByte(intiPortID,byteucByte,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ResetSAM(intiPortID,intilfOpen);[DIIImportCWItRS.dir')]publicstaticexternintGetBmp(stringfile_name,intintf);publicdelegatevoidDe_ReadlCCardComplete(clsEDZobjEDZ);publiceventDe_ReadlCCardCompleteReadICCardComplete;privatecIsEDZobjEDZ=newclsEDZ();privateintEdzilfOpen=1; 〃自动开关串口intEdziPortID;publicclslCCard()()publicboolReadlCCard(){boolbllsbPort=false;intintOpenPortRtn=0;intrtnTemp=0;intpucllN=0;intpucSN=0;intpuiCHMsgLen=0;intpuiPHMsgLen=0;objEDZ=newclsEDZ();〃检测usbロ的机具连接,必须先检测usbfor(intiPort=1001;iPort<=1016;iPort++)(intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn==144)(EdziPortID=iPort;bllsbPort=true;break;}}〃检测串口的机具连接if(IbUsbPort){for(intiPort=1;iPort<=2;iPort++)(intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn==144)(EdziPortID=iPort;bUsbPort=false;break;}}}if(intOpenPortRtn!=144){MessageBox.Show("端口打开失败,请检测相应的端口或者重新连接读卡器!","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;}〃在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,〃您要考虑机具连接端口被用户改变的情况哦〃下面找卡rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);if(rtnTemp!=159)(rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);〃再找卡if(rtnTemp!=159)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show("未放卡或者卡未放好,请重新放卡!「提示”,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;}}〃选卡rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);if(rtnTemp!=144)(rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);〃再选卡if(rtnTemp!=144)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show("读卡失败!",“提示“,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;}}〃注意,在这里,用户必须有应用程序当前目录的读写权限FileinfoobjFile=newFilelnfo("wz.txt");if(objFile.Exists)(objFile.Attributes=FileAttributes.Normal;objFile.Delete();)objFile=newFilelnfo(”zp.bmp”);if(objFile.Exists)(objFile.Attributes=FileAttributes.Normal;objFile.Delete();}objFile=newFilelnfo(”zp.wlt”);if(objFile.Exists)objFile.Attributes=FileAttributes.Normal;objFile.Delete();)rtnTemp=SDT_ReadBaseMsgToFile(EdziPortlD,"wz.txt",refpuiCHMsgLen,Mzp.wlt",refpuiPHMsgLen,EdzilfOpen);if(rtnTemp!=144)(rtnTemp=SDTCIosePort(EdziPortlD);MessageBox.Show("读卡失败!",“提示“,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;)〃下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb丄ic,照片解析将会失败if(bUsbPort)rtnTemp=GetBmp(Mzp.wltM,2);elsertnTemp=GetBmp("zp.wltH,1);switch(rtnTemp){case0:MessageBox.Show("调用sdtapi.dl!错误!",“提示",MessageBoxButtons.OK,MessageBoxIcon.Error);break;case1:〃正常break;case-1:MessageBox.Show("相片解码错误!","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-2:MessageBox.Show(”wlt文件后缀错误!",”提示“,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-3:MessageBox.Show("wlt文件打开错误!",“提示”,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-4:MessageBox.Show("wlt文件格式错误!",”提示",MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-5:MessageBox.Show("软件未授权!","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-6:MessageBox.Show("设备连接错误!",“提示“,MessageBoxButtons.OK,MessageBoxIcon.Error);break;)rtnTemp=SDT_ClosePort(EdziPortlD);Fileinfof=newFilelnfo(Hwz.txt");FileStreamfs=f.OpenRead();byte[]bt=newbyte[fs.Length];fs.Read(bt,0,(int)fs.Length);fs.Close();stringstr=System.Text.UnicodeEncoding.Unicode.GetString(bt);objEDZ.Name=System.Text.UnicodeEncoding.Unicode.GetString(bt,0,30).Trim();objEDZ.Sex_Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,30,2).Trim();objEDZ.NATION_Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,32,4).Trim();stringstrBird=System.Text.UnicodeEncoding.Unicode.GetString(bt,36,16).Trim();objEDZ.BIRTH=Convert.ToDateTime(strBird.Substring(0,4)+”年”+strBird.Substring(4,2)+”月”+strBird.Substring(6)+”日”);objEDZ.ADDRESS=System.Text.UnicodeEncoding.Unicode.GetString(bt,52,70).Trim();objEDZ.lDC=System.Text.UnicodeEncoding.Unicode.GetString(bt,122,36).Trim();objEDZ.REGORG=System.Text.UnicodeEncoding.Unicode.GetString(bt,158,30).Trim();stringstrTem=System.Text.UnicodeEncoding.Unicode.GetString(bt,188,bt.GetLength(O)-188).Trim();objEDZ.STARTDATE=Convert.ToDateTime(strTem.Substring^,4)+”年”+strTem.Substring(4,2)+”月”+strTem.Substring(6,2)+”日”);strTem=strTem.Substring(8);if(strTem.Trim()!=”长期”)(objEDZ.ENDDATE=Convert.ToDateTime(strTem.Substring(0,4)+“年"+strTem.Substring(4,2)+”月”+strTem.Substring(6,2)+”日”);)elseobjEDZ.ENDDATE=DateTime.MaxValue;}objFile=newFilelnfo(wzp.bmpM);if(objFile.Exists)(Imageimg=Image.FromFile("zp.bmp");objEDZ.PICJmage=(lmage)img.Clone();System.IO.Memorystreamm=newMemoryStream();img.Save(m,System.Drawing.Imaging.ImageFormat.Jpeg);objEDZ.PIC_Byte=m.ToArray();img.Dispose();img=null;}ReadlCCardComplete(objEDZ);returntrue;}}publicclasscIsEDZ(privateSystem.Collections.SortedListIstMZ=newSortedList();privatestring_Name;〃姓名privatestring_Sex_Code;〃性别代码privatestring_Sex_CName;〃性别privatestring_IDC;〃身份证号码privatestring_NATION_Code;〃民族代码privatestring_NATION_CName;〃民族privateDateTime_BIRTH;〃出生日期privatestring_ADDRESS;〃住址privatestring_REGORG;〃签发机关privateDateTime_STARTDATE;〃身份证有效起始日期privateDateTime_ENDDATE;〃身份证有效截至日期privatestring_Period_Of_Validity_Code;〃有效期限代码,许多原来系统上面为了一代证考虑,常常存在这样的字段,二代证中已经没有了privatestring_Period_Of_Validity_CName;〃有效期限privatebyte[]_PIC_Byte;〃照片二进制privateImage_PIC_lmage;〃照片publiccIsEDZQlstMZ.Add(“01"IstM乙Add(“02”IstM乙Add(“03"IstM乙Add(“04”lstMZ.Add("05"lstMZ.Add(“06"lstMZ.Add(“07”lstMZ.Add(“08”lstMZ.Add(009MIstM乙Add(“1O”lstMZ.Add(Hir,lstMZ.Add(h12MIstM乙Add(“13”IstM乙Add(“14"lstMZ.Add(M15nlstMZ.Add(M16"lstMZ.Ad
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苏教版平移和旋转教学课件
- 中医消化系统疾病的调理与治疗
- 螺旋动脉瘤栓塞术全程解说
- 中西医结合在慢性肝炎疾病治疗中的临床实践总结
- 手部逆龄保养攻略减缓老化保持年轻
- 夏季手部护理小贴士护住晒伤的双手
- 延安职业技术学院《中西医结合外科学(二)》2023-2024学年第二学期期末试卷
- 动漫绘本课程课件
- 清明节的文化符号
- 济宁市重点中学2024-2025学年初三回头联考化学试题试卷含解析
- 情报信息发布规范
- 无卤阻燃剂知识培训课件
- DB42∕T 1496-2019 公路边坡监测技术规程
- 2025贵州省安全员-C证考试(专职安全员)题库及答案
- 2025-2030年中国小麦加工产业运行动态及发展可行性分析报告
- 乾坤未定皆有可能-2025届高三百日誓师班会课件
- 2025年山西汾西矿业集团公司招聘笔试参考题库含答案解析
- 2024年度英语课件容貌焦虑
- 神经外科质量与安全管理工作计划
- 城市违建拆除施工方案
- 复色激光光谱分析研究
评论
0/150
提交评论