新中新身份证阅读器C++实现

 最近有个身份证识别功能需要实现,通过整理把接口进行了封装整理,方便其他业务逻辑调用,代码如下:

1、IDCardHelper.h

#pragma once
#include <map>

#pragma pack(1)
typedef struct tagIDCardData {
	char Name[32];		//姓名       
	char Sex[6];		//性别
	char Nation[64];	//名族
	char Born[18];		//出生日期
	char Address[72];	//住址
	char IDCardNo[38];	//身份证号
	char GrantDept[32]; //发证机关
	char UserLifeBegin[18];	// 有效开始日期
	char UserLifeEnd[18];	// 有效截止日期
	char PassID[20];		// 通行证号码
	char IssuesTimes[6];	//签发次数
	char reserved[12];		// 保留
	char PhotoFileName[255];// 照片路径

	char CardType[4];    //证件类型
	char EngName[122];   //英文名
	char CertVol[6];     //证件版本号
}IDCardData;
#pragma pack()

typedef int(*ProgressCallback)(int progress);

//二代证相关API---------------------------------------------------------------------------------------
typedef int (_stdcall *Syn_GetCOMBaud)(int iPort, unsigned int *  puiBaudRate);
typedef int (_stdcall *Syn_SetCOMBaud)(int iPort, unsigned int uiCurrBaud, unsigned int uiSetBaud);
typedef int (_stdcall *Syn_OpenPort)(int iPort);
typedef int (_stdcall *Syn_ClosePort)(int iPort);
//
//				SAM类函数
//
//
typedef int (_stdcall *Syn_SetMaxRFByte)(int	iPort, unsigned char ucByte, int	bIfOpen);
typedef int (_stdcall *Syn_ResetSAM)(int  iPort, int	iIfOpen);
typedef int (_stdcall *Syn_GetSAMStatus)(int iPort, int iIfOpen);
typedef int (_stdcall *Syn_GetSAMID)(int iPort, unsigned char *	pucSAMID, int iIfOpen);
typedef int (_stdcall *Syn_GetSAMIDToStr)(int iPort, char *	pcSAMID, int iIfOpen);
//
//				身份证卡类函数
//
//
typedef int (_stdcall *Syn_StartFindIDCard)(int iPort, unsigned char *	pucIIN, int	iIfOpen);
typedef int (_stdcall *Syn_SelectIDCard)(int iPort, unsigned char * pucSN, int iIfOpen);
typedef int (_stdcall *Syn_ReadBaseMsg)(
	int				iPort,
	unsigned char * pucCHMsg,
	unsigned int  * puiCHMsgLen,
	unsigned char * pucPHMsg,
	unsigned int  *	puiPHMsgLen,
	int				iIfOpen);
typedef int (_stdcall *Syn_ReadBaseMsgToFile)(
	int 			iPort,
	char * 			pcCHMsgFileName,
	unsigned int *	puiCHMsgFileLen,
	char * 			pcPHMsgFileName,
	unsigned int  *	puiPHMsgFileLen,
	int				iIfOpen
	);
typedef int	(_stdcall *Syn_ReadBaseFPMsg)(
	int				iPort,
	unsigned char *	pucCHMsg,
	unsigned int  *	puiCHMsgLen,
	unsigned char *	pucPHMsg,
	unsigned int  *	puiPHMsgLen,
	unsigned char *	pucFPMsg,
	unsigned int  *	puiFPMsgLen,
	int				iIfOpen
	);
typedef int	(_stdcall *Syn_ReadBaseFPMsgToFile)(
	int				iPort,
	char *			pcCHMsgFileName,
	unsigned int *	puiCHMsgFileLen,
	char *			pcPHMsgFileName,
	unsigned int *	puiPHMsgFileLen,
	char *			pcFPMsgFileName,
	unsigned int *	puiFPMsgFileLen,
	int				iIfOpen
	);
typedef int (_stdcall *Syn_ReadNewAppMsg)(int iPort, unsigned char * pucAppMsg, unsigned int * puiAppMsgLen, int iIfOpen);
typedef int (_stdcall *Syn_GetBmp)(int iPort, char * Wlt_File);

typedef int (_stdcall *Syn_ReadMsg)(int iPort, int iIfOpen, IDCardData *pIDCardData);
typedef int (_stdcall *Syn_ReadFPMsg)(int iPort, int iIfOpen, IDCardData *pIDCardData, char * cFPhotoname);

typedef int (_stdcall *Syn_FindReader)();
typedef int (_stdcall *Syn_FindUSBReader)();

typedef int (_stdcall *Syn_BmpToJpeg)(char * cBmpName, char * cJpegName);
typedef int (_stdcall *Syn_PhotoToStrBase64)(char * cBase64, int * iLen, char *cPhotoName);
typedef int (_stdcall *Syn_StrBase64ToPhoto)(char * cBase64, int iLen, char *cPhotoName);
//
//				设置附加功能函数
//
//
typedef int (_stdcall *Syn_SetPhotoPath)(int iOption, char * cPhotoPath);
typedef int (_stdcall *Syn_SetPhotoType)(int iType);
typedef int (_stdcall *Syn_SetPhotoName)(int iType);
typedef int (_stdcall *Syn_SetPhotoNameEx)(int iType, char * cPhotoname);
typedef int (_stdcall *Syn_SetSexType)(int iType);
typedef int (_stdcall *Syn_SetNationType)(int iType);
typedef int (_stdcall *Syn_SetBornType)(int iType);
typedef int (_stdcall *Syn_SetUserLifeBType)(int iType);
typedef int (_stdcall *Syn_SetUserLifeEType)(int iType, int iOption);

//
//				USBHID函数
//
//

typedef int (_stdcall *Syn_USBHIDM1Reset)(int iPort, DWORD * pdwCardSN, unsigned char * pbSize);
typedef int (_stdcall *Syn_USBHIDM1AuthenKey)(int iPort, unsigned char KeyType, unsigned char BlockNo, unsigned char * pKey);
typedef int (_stdcall *Syn_USBHIDM1ReadBlock)(int iPort, unsigned char BlockNo, unsigned char * pBlock);
typedef int (_stdcall *Syn_USBHIDM1WriteBlock)(int iPort, unsigned char BlockNo, unsigned char * pBlock);
typedef int (_stdcall *Syn_USBHIDM1Halt)(int iPort);
typedef int (_stdcall *Syn_USBHIDReadFactoryInfo)(
	int iPort,
	unsigned char * pFactory,
	unsigned char * pVol,
	unsigned char * pSerialNo,
	unsigned char * pReserved);
typedef int (_stdcall *Syn_USBHIDWriteFactoryInfo)(
	int iPort,
	unsigned char * pFactory,
	unsigned char * pVol,
	unsigned char * pSerialNo,
	unsigned char * pReserved);
typedef int (_stdcall *Syn_USBHIDReadUserInfo)(int iPort, unsigned char *pInfo);
typedef int (_stdcall *Syn_USBHIDWriteUserInfo)(int iPort, unsigned char *pInfo);
typedef int (_stdcall *Syn_USBHIDGetMaxByte)(int iPort, unsigned char *pSAMMaxByte, unsigned char *pARMVol);
typedef int (_stdcall *Syn_USBHIDSendSound)(int iPort, unsigned char ucSound);
typedef int (_stdcall *Syn_USBHIDControlLED)(int iPort, unsigned char ucLed);
typedef int (_stdcall *Syn_USBHIDControlBeep)(int iPort, unsigned char ucType, unsigned short usTime);
typedef int (_stdcall *Syn_USBHIDGetSecCardID)(int iPort, unsigned char * pdwCardSN);

typedef int (_stdcall *Syn_USBHIDSIMpowerOn)(int iPort, unsigned char * ucATR, unsigned char * ucLen);
typedef int (_stdcall *Syn_USBHIDSIMpowerOff)(int iPort);
typedef int (_stdcall *Syn_USBHIDSIMAPDU)(int iPort, int slen, unsigned char *datasend, int* rlen, unsigned char* datareceive);
//typedef int (_stdcall *Syn_USBHIDReadUserMac)(int iPort, unsigned char *pMac);
typedef int (_stdcall *Syn_USBHIDWriteUserMac)(int iPort, unsigned char *pMac);
//add new interface
//int _stdcall Syn_USBHIDSetTransportType(int iPort,int type);
typedef int (_stdcall *Syn_USBHIDSetUserIDCode)(int iPort, unsigned char *code, int len);
typedef int (_stdcall *Syn_USBHIDIsEncryptMode)(int iPort);
typedef int (_stdcall *Syn_USBHIDdoUpdate)(int iPort, unsigned char *updateBuffer, long bufferLen, ProgressCallback progressCallback);
//
//				USBReade.dll USBHID函数
//
//
//typedef int (_stdcall *Syn_USBOpenPort)(int iPort);
//typedef int (_stdcall *Syn_USBClosePort)(int iPort);
//typedef int (_stdcall *Syn_USBSetMaxRFByte)(int	iPort, unsigned char ucByte, int	bIfOpen);
//typedef int (_stdcall *Syn_USBStartFindIDCard)(int iPort, unsigned char *	pucIIN, int	iIfOpen);
//typedef int (_stdcall *Syn_USBSelectIDCard)(int iPort, unsigned char * pucSN, int iIfOpen);
//typedef int (_stdcall *Syn_USBReadBaseMsg)(
//	int				iPort,
//	unsigned char * pucCHMsg,
//	unsigned int  * puiCHMsgLen,
//	unsigned char * pucPHMsg,
//	unsigned int  *	puiPHMsgLen,
//	int				iIfOpen);
//typedef int	(_stdcall *Syn_USBReadBaseFPMsg)(
//	int				iPort,
//	unsigned char *	pucCHMsg,
//	unsigned int  *	puiCHMsgLen,
//	unsigned char *	pucPHMsg,
//	unsigned int  *	puiPHMsgLen,
//	unsigned char *	pucFPMsg,
//	unsigned int  *	puiFPMsgLen,
//	int				iIfOpen
//	);
//typedef int (_stdcall *Syn_USBReadNewAppMsg)(int iPort, unsigned char * pucAppMsg, unsigned int * puiAppMsgLen, int iIfOpen);

//typedef int (_stdcall *Syn_USBGetSAMID)(int iPort, unsigned char *	pucSAMID, int iIfOpen);
//typedef int (_stdcall *Syn_USBGetSAMIDToStr)(int iPort, char *	pcSAMID, int iIfOpen);

//typedef int (_stdcall *Syn_USBM1Reset)(int iPort, DWORD * pdwCardSN, unsigned char * pbSize);
//typedef int (_stdcall *Syn_USBM1AuthenKey)(int iPort, unsigned char KeyType, unsigned char BlockNo, unsigned char * pKey);
//typedef int (_stdcall *Syn_USBM1ReadBlock)(int iPort, unsigned char BlockNo, unsigned char * pBlock);
//typedef int (_stdcall *Syn_USBM1WriteBlock)(int iPort, unsigned char BlockNo, unsigned char * pBlock);
//typedef int (_stdcall *Syn_USBM1Halt)(int iPort);
//typedef int (_stdcall *Syn_USBReadFactoryInfo)(
//	int iPort,
//	unsigned char * pFactory,
//	unsigned char * pVol,
//	unsigned char * pSerialNo,
//	unsigned char * pReserved);
//typedef int (_stdcall *Syn_USBWriteFactoryInfo)(
//	int iPort,
//	unsigned char * pFactory,
//	unsigned char * pVol,
//	unsigned char * pSerialNo,
//	unsigned char * pReserved);
//typedef int (_stdcall *Syn_USBReadUserInfo)(int iPort, unsigned char *pInfo);
//typedef int (_stdcall *Syn_USBWriteUserInfo)(int iPort, unsigned char *pInfo);
//typedef int (_stdcall *Syn_USBGetMaxByte)(int iPort, unsigned char *pSAMMaxByte, unsigned char *pARMVol);
//typedef int (_stdcall *Syn_USBSendSound)(int iPort, unsigned char ucSound);
//typedef int (_stdcall *Syn_USBControlLED)(int iPort, unsigned char ucLed);
//typedef int (_stdcall *Syn_USBControlBeep)(int iPort, unsigned char ucType, unsigned short usTime);

//typedef int (_stdcall *Syn_USBGetSecCardID)(int iPort, unsigned char * pdwCardSN);

//typedef int (_stdcall *Syn_USBSIMpowerOn)(int iPort, unsigned char * ucATR, unsigned char * ucLen);
//typedef int (_stdcall *Syn_USBSIMpowerOff)(int iPort);
//typedef int (_stdcall *Syn_USBSIMAPDU)(int iPort, int slen, unsigned char *datasend, int* rlen, unsigned char* datareceive);
//typedef int (_stdcall *Syn_USBReadUserMac)(int iPort, unsigned char *pMac);
//typedef int (_stdcall *Syn_USBWriteUserMac)(int iPort, unsigned char *pMac);
//typedef int (_stdcall *Syn_USBPSAMpowerOn)( int iPort, int slot, unsigned char * ucATR, unsigned char * ucLen);
//typedef int (_stdcall *Syn_USBPSAMpowerOff)( int iPort, int slot);
//typedef int (_stdcall *Syn_USBPSAMAPDU)(int iPort, int slot,int slen,unsigned char *datasend,int* rlen,unsigned char* datareceive);
//typedef int (_stdcall *Syn_USBControlFingerLed)( int iPort,unsigned char ucType,unsigned short usTime);
typedef int (_stdcall *Syn_PSAMpowerOn)( int iPort, int slot, unsigned char * ucATR, unsigned char * ucLen);
typedef int (_stdcall *Syn_PSAMpowerOff)( int iPort, int slot);
typedef int (_stdcall *Syn_PSAMAPDU)(int iPort, int slot,int slen,unsigned char *datasend,int* rlen,unsigned char* datareceive);
typedef int (_stdcall *Syn_ControlFingerLed)( int iPort,unsigned char ucType,unsigned short usTime);
//add new interface
//int _stdcall Syn_USBSetTransportType(int iPort,int type);
//typedef int (_stdcall *Syn_USBSetUserIDCode)(int iPort, unsigned char *code, int len);
//typedef int (_stdcall *Syn_USBIsEncryptMode)(int iPort);
//typedef int (_stdcall *Syn_USBdoUpdate)(int iPort, unsigned char *updateBuffer, long bufferLen, ProgressCallback progressCallback);


//
//				串口操作M1卡函数
//
//

typedef int (_stdcall *Syn_SerialFindReader)(int iPort, unsigned int* badurate);
typedef int (_stdcall *Syn_SerialOpen)(int iPort, int badurate);
typedef int (_stdcall *Syn_SerialClose)(int iPort);
typedef int (_stdcall *Syn_SerialM1Reset)(int iPort, DWORD * pdwCardSN, unsigned char * pbSize);
typedef int (_stdcall *Syn_SerialM1AuthenKey)(int iPort, unsigned char KeyType, unsigned char BlockNo, unsigned char * pKey);
typedef int (_stdcall *Syn_SerialM1ReadBlock)(int iPort, unsigned char BlockNo, unsigned char * pBlock);
typedef int (_stdcall *Syn_SerialM1WriteBlock)(int iPort, unsigned char BlockNo, unsigned char * pBlock);
typedef int (_stdcall *Syn_SerialM1Halt)(int iPort);
typedef int (_stdcall *Syn_SerialStartFindCPUCard)( int iPort , unsigned char *	ATS,  int *rlen);
typedef int (_stdcall *Syn_SerialStartRemoveCPUCard)( int iPort , unsigned char * ATS);
typedef int (_stdcall *Syn_SerialPCTOCPUCard)(int iPort,int slen,unsigned char *datasend,int* rlen,unsigned char* datareceive);
typedef int (_stdcall *Syn_SerialSIMpowerOn)( int iPort,  unsigned char * ucATR , unsigned char * ucLen);
typedef int (_stdcall *Syn_SerialSIMpowerOff)( int iPort);
typedef int (_stdcall *Syn_SerialSIMAPDU)(int iPort,int slen,unsigned char *datasend,int* rlen,unsigned char* datareceive);
typedef int (_stdcall *Syn_SerialControlBeep)( int iPort,unsigned char ucType,unsigned short usTime);
typedef int (_stdcall *Syn_SerialGetSecCardID)( int iPort,  unsigned char * pdwCardSN);

typedef int (_stdcall *Syn_SerialPSAMpowerOn)( int iPort, int slot, unsigned char * ucATR, unsigned char * ucLen);
typedef int (_stdcall *Syn_SerialPSAMpowerOff)( int iPort, int slot);
typedef int (_stdcall *Syn_SerialPSAMAPDU)(int iPort, int slot,int slen,unsigned char *datasend,int* rlen,unsigned char* datareceive);
typedef int (_stdcall *Syn_SerialControlFingerLed)( int iPort,unsigned char ucType,unsigned short usTime);

typedef int (_stdcall *Syn_SerialReadUserInfo)( int iPort,unsigned char *pInfo);
typedef int (_stdcall *Syn_SerialWriteUserInfo)( int iPort,unsigned char *pInfo);

//typedef int (_stdcall *Syn_USBStartFindCPUCard)(int iPort, unsigned char *	ATS, int *rlen);
typedef int (_stdcall *Syn_StartFindCPUCard)(int iPort, unsigned char * ATS, int *rlen);

//typedef int (_stdcall *Syn_USBStartRemoveCPUCard)(int iPort, unsigned char *	ATS);
typedef int (_stdcall *Syn_StartRemoveCPUCard)(int iPort, unsigned char * ATS);

//typedef int (_stdcall *Syn_USBPCTOCPUCard)(int iPort, int slen, unsigned char *datasend, int* rlen, unsigned char* datareceive);
typedef int (_stdcall *Syn_PCTOCPUCard)(int iPort, int slen, unsigned char *datasend, int* rlen, unsigned char* datareceive);


class IDCardHelper
{
public:

	/
	/// 单例模式访问接口
	/// @return 本类对象指针地址
	/
	static IDCardXZX* Instance(){
		static IDCardXZX icf;
		return &icf;
	}

	~IDCardXZX(void);

	int FindUSBDriverDevice();

	///寻找读卡器
	int FindCard();

    /
	/// 读取身份证信息
	/// @return 返回是否成功标志 0:成功 -1:动态库加载失败 -2:没有找到读卡器 -3:读卡器连接在串口 -4:打开端口错误 -5:获取最大通信字节数失败 
	///                          -6:端口9999异常 -7:eRR1 -8:eRR2 -9:eRR3 -10:照片解码错误 -11:完整过程读取身份证信息错误
	/
	int ReadCardInfo();

    /
	/// 清空身份证信息
	/// @return 无
	/
	void ClearIdCardInfo();

    /
	/// 获取身份证号
	/// @return 身份证号
	/
	CString IdNo(){ return m_idcardData.IDCardNo;};

    /
	/// 获取姓名
	/// @return 姓名
	/
	CString Name(){ return m_idcardData.Name;};

    /
	/// 获取性别
	/// @return 性别
	/
	CString Sex(){ return m_idcardData.Sex;};

    /
	/// 获取年龄
	/// @return 年龄
	/
	CString Age();

protected:
	IDCardXZX(void);

	/
	/// 初始化参数
	/// @return 无
	/
    void InitParam();

	/
	/// 释放设备动态库
	/// @return 无
	/
    void FreeSubModule();

    /
    /// 加载设备动态库
    /// @return 返回加载状态
	/
	bool LoadSubModule();

	Syn_GetCOMBaud XZX_GetCOMBaud;
	Syn_SetCOMBaud XZX_SetCOMBaud;
	Syn_OpenPort XZX_OpenPort;
	Syn_ClosePort XZX_ClosePort;
	//
	//				SAM类函数
	//
	//
	Syn_SetMaxRFByte XZX_SetMaxRFByte;
	Syn_ResetSAM XZX_ResetSAM;
	Syn_GetSAMStatus XZX_GetSAMStatus;
	Syn_GetSAMID XZX_GetSAMID;
	Syn_GetSAMIDToStr XZX_GetSAMIDToStr;
	//
	//				身份证卡类函数
	//
	//
	Syn_StartFindIDCard XZX_StartFindIDCard;
	Syn_SelectIDCard XZX_SelectIDCard;
	Syn_ReadBaseMsg XZX_ReadBaseMsg;
	Syn_ReadBaseMsgToFile XZX_ReadBaseMsgToFile;
	Syn_ReadBaseFPMsg XZX_ReadBaseFPMsg;
	Syn_ReadBaseFPMsgToFile XZX_ReadBaseFPMsgToFile;
	Syn_ReadNewAppMsg XZX_ReadNewAppMsg;
	Syn_GetBmp XZX_GetBmp;

	Syn_ReadMsg XZX_ReadMsg;
	Syn_ReadFPMsg XZX_ReadFPMsg;

	Syn_FindReader XZX_FindReader;
	Syn_FindUSBReader XZX_FindUSBReader;

	Syn_BmpToJpeg XZX_BmpToJpeg;
	Syn_PhotoToStrBase64 XZX_PhotoToStrBase64;
	Syn_StrBase64ToPhoto XZX_StrBase64ToPhoto;
	//
	//				设置附加功能函数
	//
	//
	Syn_SetPhotoPath XZX_SetPhotoPath;
	Syn_SetPhotoType XZX_SetPhotoType;
	Syn_SetPhotoName XZX_SetPhotoName;
	Syn_SetPhotoNameEx XZX_SetPhotoNameEx;
	Syn_SetSexType XZX_SetSexType;
	Syn_SetNationType XZX_SetNationType;
	Syn_SetBornType XZX_SetBornType;
	Syn_SetUserLifeBType XZX_SetUserLifeBType;
	Syn_SetUserLifeEType XZX_SetUserLifeEType;

	//
	//				USBHID函数
	//
	//

	Syn_USBHIDM1Reset XZX_USBHIDM1Reset;
	Syn_USBHIDM1AuthenKey XZX_USBHIDM1AuthenKey;
	Syn_USBHIDM1ReadBlock XZX_USBHIDM1ReadBlock;
	Syn_USBHIDM1WriteBlock XZX_USBHIDM1WriteBlock;
	Syn_USBHIDM1Halt XZX_USBHIDM1Halt;
	Syn_USBHIDReadFactoryInfo XZX_USBHIDReadFactoryInfo;
	Syn_USBHIDWriteFactoryInfo XZX_USBHIDWriteFactoryInfo;
	Syn_USBHIDReadUserInfo XZX_USBHIDReadUserInfo;
	Syn_USBHIDWriteUserInfo XZX_USBHIDWriteUserInfo;
	Syn_USBHIDGetMaxByte XZX_USBHIDGetMaxByte;
	Syn_USBHIDSendSound XZX_USBHIDSendSound;
	Syn_USBHIDControlLED XZX_USBHIDControlLED;
	Syn_USBHIDControlBeep XZX_USBHIDControlBeep;
	Syn_USBHIDGetSecCardID XZX_USBHIDGetSecCardID;

	Syn_USBHIDSIMpowerOn XZX_USBHIDSIMpowerOn;
	Syn_USBHIDSIMpowerOff XZX_USBHIDSIMpowerOff;
	Syn_USBHIDSIMAPDU XZX_USBHIDSIMAPDU;
	//Syn_USBHIDReadUserMac XZX_USBHIDReadUserMac;
	Syn_USBHIDWriteUserMac XZX_USBHIDWriteUserMac;
	//add new interface
	//int _stdcall Syn_USBHIDSetTransportType(int iPort,int type);
	Syn_USBHIDSetUserIDCode XZX_USBHIDSetUserIDCode;
	Syn_USBHIDIsEncryptMode XZX_USBHIDIsEncryptMode;
	Syn_USBHIDdoUpdate XZX_USBHIDdoUpdate;
	//
	//				USBReade.dll USBHID函数
	//
	//
	//Syn_USBOpenPort XZX_USBOpenPort;
	//Syn_USBClosePort XZX_USBClosePort;
	//Syn_USBSetMaxRFByte XZX_USBSetMaxRFByte;
	//Syn_USBStartFindIDCard XZX_USBStartFindIDCard;
	//Syn_USBSelectIDCard XZX_USBSelectIDCard;
	//Syn_USBReadBaseMsg XZX_USBReadBaseMsg;
	//Syn_USBReadBaseFPMsg XZX_USBReadBaseFPMsg;
	//Syn_USBReadNewAppMsg XZX_USBReadNewAppMsg;

	//Syn_USBGetSAMID XZX_USBGetSAMID;
	//Syn_USBGetSAMIDToStr XZX_USBGetSAMIDToStr;

	//Syn_USBM1Reset XZX_USBM1Reset;
	//Syn_USBM1AuthenKey XZX_USBM1AuthenKey;
	//Syn_USBM1ReadBlock XZX_USBM1ReadBlock;
	//Syn_USBM1WriteBlock XZX_USBM1WriteBlock;
	//Syn_USBM1Halt XZX_USBM1Halt;
	//Syn_USBReadFactoryInfo XZX_USBReadFactoryInfo;
	//Syn_USBWriteFactoryInfo XZX_USBWriteFactoryInfo;
	//Syn_USBReadUserInfo XZX_USBReadUserInfo;
	//Syn_USBWriteUserInfo XZX_USBWriteUserInfo;
	//Syn_USBGetMaxByte XZX_USBGetMaxByte;
	//Syn_USBSendSound XZX_USBSendSound;
	//Syn_USBControlLED XZX_USBControlLED;
	//Syn_USBControlBeep XZX_USBControlBeep;

	//Syn_USBGetSecCardID XZX_USBGetSecCardID;

	//Syn_USBSIMpowerOn XZX_USBSIMpowerOn;
	//Syn_USBSIMpowerOff XZX_USBSIMpowerOff;
	//Syn_USBSIMAPDU XZX_USBSIMAPDU;
	//Syn_USBReadUserMac XZX_USBReadUserMac;
	//Syn_USBWriteUserMac XZX_USBWriteUserMac;
	//Syn_USBPSAMpowerOn XZX_USBPSAMpowerOn;
	//Syn_USBPSAMpowerOff XZX_USBPSAMpowerOff;
	//Syn_USBPSAMAPDU XZX_USBPSAMAPDU;
	//Syn_USBControlFingerLed XZX_USBControlFingerLed;
	Syn_PSAMpowerOn XZX_PSAMpowerOn;
	Syn_PSAMpowerOff XZX_PSAMpowerOff;
	Syn_PSAMAPDU XZX_PSAMAPDU;
	Syn_ControlFingerLed XZX_ControlFingerLed;
	//add new interface
	//int _stdcall Syn_USBSetTransportType(int iPort,int type);
	//Syn_USBSetUserIDCode XZX_USBSetUserIDCode;
	//Syn_USBIsEncryptMode XZX_USBIsEncryptMode;
	//Syn_USBdoUpdate XZX_USBdoUpdate;


	//
	//				串口操作M1卡函数
	//
	//

	Syn_SerialFindReader XZX_SerialFindReader;
	Syn_SerialOpen XZX_SerialOpen;
	Syn_SerialClose XZX_SerialClose;
	Syn_SerialM1Reset XZX_SerialM1Reset;
	Syn_SerialM1AuthenKey XZX_SerialM1AuthenKey;
	Syn_SerialM1ReadBlock XZX_SerialM1ReadBlock;
	Syn_SerialM1WriteBlock XZX_SerialM1WriteBlock;
	Syn_SerialM1Halt XZX_SerialM1Halt;
	Syn_SerialStartFindCPUCard XZX_SerialStartFindCPUCard;
	Syn_SerialStartRemoveCPUCard XZX_SerialStartRemoveCPUCard;
	Syn_SerialPCTOCPUCard XZX_SerialPCTOCPUCard;
	Syn_SerialSIMpowerOn XZX_SerialSIMpowerOn;
	Syn_SerialSIMpowerOff XZX_SerialSIMpowerOff;
	Syn_SerialSIMAPDU XZX_SerialSIMAPDU;
	Syn_SerialControlBeep XZX_SerialControlBeep;
	Syn_SerialGetSecCardID XZX_SerialGetSecCardID;

	Syn_SerialPSAMpowerOn XZX_SerialPSAMpowerOn;
	Syn_SerialPSAMpowerOff XZX_SerialPSAMpowerOff;
	Syn_SerialPSAMAPDU XZX_SerialPSAMAPDU;
	Syn_SerialControlFingerLed XZX_SerialControlFingerLed;

	Syn_SerialReadUserInfo XZX_SerialReadUserInfo;
	Syn_SerialWriteUserInfo XZX_SerialWriteUserInfo;

	//Syn_USBStartFindCPUCard XZX_USBStartFindCPUCard;
	Syn_StartFindCPUCard XZX_StartFindCPUCard;

	//Syn_USBStartRemoveCPUCard XZX_USBStartRemoveCPUCard;
	Syn_StartRemoveCPUCard XZX_StartRemoveCPUCard;

	//Syn_USBPCTOCPUCard XZX_USBPCTOCPUCard;
	Syn_PCTOCPUCard XZX_PCTOCPUCard;

protected:
	HINSTANCE m_hSubModuleA;
	bool m_bSubModEnable;
	int m_iPort;
	unsigned int m_CurrBaud;
	unsigned char m_iMaxByte;
	int m_iReadStart;
	int m_iReadSum;
	int m_iReadOKSum;
	IDCardData m_idcardData;
	int m_errNum;

public:
	std::map<int,CString> m_errMsgs;
	bool link;
};

2、IDCardHelper.cpp

#include "stdafx.h"
#include "IDCardXZX.h"


IDCardXZX::IDCardXZX(void)
{
	InitParam();
	memset(&m_idcardData,0,sizeof(m_idcardData));
	link = true;
}


IDCardXZX::~IDCardXZX(void)
{
	FreeSubModule();
}

/
/// 初始化参数
/// @return 无
/
void IDCardXZX::InitParam()
{
	m_hSubModuleA = NULL;
	m_bSubModEnable = false;

	XZX_FindReader = NULL;
}

/
/// 释放设备动态库
/// @return 无
/
void IDCardXZX::FreeSubModule()
{
	if(NULL != m_hSubModuleA)
	{
		FreeLibrary(m_hSubModuleA);
		m_hSubModuleA = NULL;

		XZX_GetCOMBaud = NULL;
		XZX_SetCOMBaud = NULL;
		XZX_OpenPort = NULL;
		XZX_ClosePort = NULL;
		//
		//				SAM类函数
		//
		//
		XZX_SetMaxRFByte = NULL;
		XZX_ResetSAM = NULL;
		XZX_GetSAMStatus = NULL;
		XZX_GetSAMID = NULL;
		XZX_GetSAMIDToStr = NULL;
		//
		//				身份证卡类函数
		//
		//
		XZX_StartFindIDCard = NULL;
		XZX_SelectIDCard = NULL;
		XZX_ReadBaseMsg = NULL;
		XZX_ReadBaseMsgToFile = NULL;
		XZX_ReadBaseFPMsg = NULL;
		XZX_ReadBaseFPMsgToFile = NULL;
		XZX_ReadNewAppMsg = NULL;
		XZX_GetBmp = NULL;

		XZX_ReadMsg = NULL;
		XZX_ReadFPMsg = NULL;

		XZX_FindReader = NULL;
		XZX_FindUSBReader = NULL;

		XZX_BmpToJpeg = NULL;
		XZX_PhotoToStrBase64 = NULL;
		XZX_StrBase64ToPhoto = NULL;
		//
		//				设置附加功能函数
		//
		//
		XZX_SetPhotoPath = NULL;
		XZX_SetPhotoType = NULL;
		XZX_SetPhotoName = NULL;
		XZX_SetPhotoNameEx = NULL;
		XZX_SetSexType = NULL;
		XZX_SetNationType = NULL;
		XZX_SetBornType = NULL;
		XZX_SetUserLifeBType = NULL;
		XZX_SetUserLifeEType = NULL;

		//
		//				USBHID函数
		//
		//

		XZX_USBHIDM1Reset = NULL;
		XZX_USBHIDM1AuthenKey = NULL;
		XZX_USBHIDM1ReadBlock = NULL;
		XZX_USBHIDM1WriteBlock = NULL;
		XZX_USBHIDM1Halt = NULL;
		XZX_USBHIDReadFactoryInfo = NULL;
		XZX_USBHIDWriteFactoryInfo = NULL;
		XZX_USBHIDReadUserInfo = NULL;
		XZX_USBHIDWriteUserInfo = NULL;
		XZX_USBHIDGetMaxByte = NULL;
		XZX_USBHIDSendSound = NULL;
		XZX_USBHIDControlLED = NULL;
		XZX_USBHIDControlBeep = NULL;
		XZX_USBHIDGetSecCardID = NULL;

		XZX_USBHIDSIMpowerOn = NULL;
		XZX_USBHIDSIMpowerOff = NULL;
		XZX_USBHIDSIMAPDU = NULL;
		//XZX_USBHIDReadUserMac = NULL;
		XZX_USBHIDWriteUserMac = NULL;
		//add new interface
		//int _stdcall Syn_USBHIDSetTransportType(int iPort,int type);
		XZX_USBHIDSetUserIDCode = NULL;
		XZX_USBHIDIsEncryptMode = NULL;
		XZX_USBHIDdoUpdate = NULL;
		//
		//				USBReade.dll USBHID函数
		//
		//
		//XZX_USBOpenPort = NULL;
		//XZX_USBClosePort = NULL;
		//XZX_USBSetMaxRFByte = NULL;
		//XZX_USBStartFindIDCard = NULL;
		//XZX_USBSelectIDCard = NULL;
		//XZX_USBReadBaseMsg = NULL;
		//XZX_USBReadBaseFPMsg = NULL;
		//XZX_USBReadNewAppMsg = NULL;

		//XZX_USBGetSAMID = NULL;
		//XZX_USBGetSAMIDToStr = NULL;

		//XZX_USBM1Reset = NULL;
		//XZX_USBM1AuthenKey = NULL;
		//XZX_USBM1ReadBlock = NULL;
		//XZX_USBM1WriteBlock = NULL;
		//XZX_USBM1Halt = NULL;
		//XZX_USBReadFactoryInfo = NULL;
		//XZX_USBWriteFactoryInfo = NULL;
		//XZX_USBReadUserInfo = NULL;
		//XZX_USBWriteUserInfo = NULL;
		//XZX_USBGetMaxByte = NULL;
		//XZX_USBSendSound = NULL;
		//XZX_USBControlLED = NULL;
		//XZX_USBControlBeep = NULL;

		//XZX_USBGetSecCardID = NULL;

		//XZX_USBSIMpowerOn = NULL;
		//XZX_USBSIMpowerOff = NULL;
		//XZX_USBSIMAPDU = NULL;
		//XZX_USBReadUserMac = NULL;
		//XZX_USBWriteUserMac = NULL;
		//XZX_USBPSAMpowerOn = NULL;
		//XZX_USBPSAMpowerOff = NULL;
		//XZX_USBPSAMAPDU = NULL;
		//XZX_USBControlFingerLed = NULL;
		XZX_PSAMpowerOn = NULL;
		XZX_PSAMpowerOff = NULL;
		XZX_PSAMAPDU = NULL;
		XZX_ControlFingerLed = NULL;
		//add new interface
		//int _stdcall Syn_USBSetTransportType(int iPort,int type);
		//XZX_USBSetUserIDCode = NULL;
		//XZX_USBIsEncryptMode = NULL;
		//XZX_USBdoUpdate = NULL;


		//
		//				串口操作M1卡函数
		//
		//

		XZX_SerialFindReader = NULL;
		XZX_SerialOpen = NULL;
		XZX_SerialClose = NULL;
		XZX_SerialM1Reset = NULL;
		XZX_SerialM1AuthenKey = NULL;
		XZX_SerialM1WriteBlock = NULL;
		XZX_SerialM1Halt = NULL;
		XZX_SerialStartFindCPUCard = NULL;
		XZX_SerialStartRemoveCPUCard = NULL;
		XZX_SerialPCTOCPUCard = NULL;
		XZX_SerialSIMpowerOn = NULL;
		XZX_SerialSIMpowerOff = NULL;
		XZX_SerialSIMAPDU = NULL;
		XZX_SerialControlBeep = NULL;
		XZX_SerialGetSecCardID = NULL;

		XZX_SerialPSAMpowerOn = NULL;
		XZX_SerialPSAMpowerOff = NULL;
		XZX_SerialPSAMAPDU = NULL;
		XZX_SerialControlFingerLed = NULL;

		XZX_SerialReadUserInfo = NULL;
		XZX_SerialWriteUserInfo = NULL;

		//XZX_USBStartFindCPUCard = NULL;
		XZX_StartFindCPUCard = NULL;

		//XZX_USBStartRemoveCPUCard = NULL;
		XZX_StartRemoveCPUCard = NULL;

		//XZX_USBPCTOCPUCard = NULL;
		XZX_PCTOCPUCard = NULL;

	}
}

/
/// 加载设备动态库
/// @return 返回加载状态
/
bool IDCardXZX::LoadSubModule()
{
	bool bRet = false;

	do 
	{
		if(m_bSubModEnable)//判断动态库是否已加载
		{
			bRet = true;
			break;
		}

		m_hSubModuleA = LoadLibrary(_T("SynIDCardAPI.dll"));//加载设备动态库
		if(NULL == m_hSubModuleA)
		{
			break;
		}

		//二代证相关API---------------------------------------------------------------------------------------
		//XZX_FindReader = (Syn_FindReader)GetProcAddress(m_hSubModuleA, "Syn_FindReader");
		//if(NULL == XZX_FindReader)
		//{
		//	break;
		//}
		XZX_GetCOMBaud = (Syn_GetCOMBaud)GetProcAddress(m_hSubModuleA, "Syn_GetCOMBaud");
		if(NULL == XZX_GetCOMBaud) break;
		XZX_SetCOMBaud = (Syn_SetCOMBaud)GetProcAddress(m_hSubModuleA, "Syn_SetCOMBaud");
		if(NULL == XZX_SetCOMBaud) break;
		XZX_OpenPort = (Syn_OpenPort)GetProcAddress(m_hSubModuleA, "Syn_OpenPort");
		if(NULL == XZX_OpenPort) break;
		XZX_ClosePort = (Syn_ClosePort)GetProcAddress(m_hSubModuleA, "Syn_ClosePort");
		if(NULL == XZX_ClosePort) break;
		//
		//				SAM类函数
		//
		//
		XZX_SetMaxRFByte = (Syn_SetMaxRFByte)GetProcAddress(m_hSubModuleA, "Syn_SetMaxRFByte");
		if(NULL == XZX_SetMaxRFByte) break;
		XZX_ResetSAM = (Syn_ResetSAM)GetProcAddress(m_hSubModuleA, "Syn_ResetSAM");
		if(NULL == XZX_ResetSAM) break;
		XZX_GetSAMStatus = (Syn_GetSAMStatus)GetProcAddress(m_hSubModuleA, "Syn_GetSAMStatus");
		if(NULL == XZX_GetSAMStatus) break;
		XZX_GetSAMID = (Syn_GetSAMID)GetProcAddress(m_hSubModuleA, "Syn_GetSAMID");
		if(NULL == XZX_GetSAMID) break;
		XZX_GetSAMIDToStr = (Syn_GetSAMIDToStr)GetProcAddress(m_hSubModuleA, "Syn_GetSAMIDToStr");
		if(NULL == XZX_GetSAMIDToStr) break;
		//
		//				身份证卡类函数
		//
		//
		XZX_StartFindIDCard = (Syn_StartFindIDCard)GetProcAddress(m_hSubModuleA, "Syn_StartFindIDCard");
		if(NULL == XZX_StartFindIDCard) break;
		XZX_SelectIDCard = (Syn_SelectIDCard)GetProcAddress(m_hSubModuleA, "Syn_SelectIDCard");
		if(NULL == XZX_SelectIDCard) break;
		XZX_ReadBaseMsg = (Syn_ReadBaseMsg)GetProcAddress(m_hSubModuleA, "Syn_ReadBaseMsg");
		if(NULL == XZX_ReadBaseMsg) break;
		XZX_ReadBaseMsgToFile = (Syn_ReadBaseMsgToFile)GetProcAddress(m_hSubModuleA, "Syn_ReadBaseMsgToFile");
		if(NULL == XZX_ReadBaseMsgToFile) break;
		XZX_ReadBaseFPMsg = (Syn_ReadBaseFPMsg)GetProcAddress(m_hSubModuleA, "Syn_ReadBaseFPMsg");
		if(NULL == XZX_ReadBaseFPMsg) break;
		XZX_ReadBaseFPMsgToFile = (Syn_ReadBaseFPMsgToFile)GetProcAddress(m_hSubModuleA, "Syn_ReadBaseFPMsgToFile");
		if(NULL == XZX_ReadBaseFPMsgToFile) break;
		XZX_ReadNewAppMsg = (Syn_ReadNewAppMsg)GetProcAddress(m_hSubModuleA, "Syn_ReadNewAppMsg");
		if(NULL == XZX_ReadNewAppMsg) break;
		XZX_GetBmp = (Syn_GetBmp)GetProcAddress(m_hSubModuleA, "Syn_GetBmp");
		if(NULL == XZX_GetBmp) break;
		XZX_ReadMsg = (Syn_ReadMsg)GetProcAddress(m_hSubModuleA, "Syn_ReadMsg");
		if(NULL == XZX_ReadMsg) break;
		XZX_ReadFPMsg = (Syn_ReadFPMsg)GetProcAddress(m_hSubModuleA, "Syn_ReadFPMsg");
		if(NULL == XZX_ReadFPMsg) break;
		XZX_FindReader = (Syn_FindReader)GetProcAddress(m_hSubModuleA, "Syn_FindReader");
		if(NULL == XZX_FindReader) break;
		XZX_FindUSBReader = (Syn_FindUSBReader)GetProcAddress(m_hSubModuleA, "Syn_FindUSBReader");
		if(NULL == XZX_FindUSBReader) break;
		XZX_BmpToJpeg = (Syn_BmpToJpeg)GetProcAddress(m_hSubModuleA, "Syn_BmpToJpeg");
		if(NULL == XZX_BmpToJpeg) break;
		XZX_PhotoToStrBase64 = (Syn_PhotoToStrBase64)GetProcAddress(m_hSubModuleA, "Syn_PhotoToStrBase64");
		if(NULL == XZX_PhotoToStrBase64) break;
		XZX_StrBase64ToPhoto = (Syn_StrBase64ToPhoto)GetProcAddress(m_hSubModuleA, "Syn_StrBase64ToPhoto");
		if(NULL == XZX_StrBase64ToPhoto) break;
		//
		//				设置附加功能函数
		//
		//
		XZX_SetPhotoPath = (Syn_SetPhotoPath)GetProcAddress(m_hSubModuleA, "Syn_SetPhotoPath");
		if(NULL == XZX_SetPhotoPath) break;
		XZX_SetPhotoType = (Syn_SetPhotoType)GetProcAddress(m_hSubModuleA, "Syn_SetPhotoType");
		if(NULL == XZX_SetPhotoType) break;
		XZX_SetPhotoName = (Syn_SetPhotoName)GetProcAddress(m_hSubModuleA, "Syn_SetPhotoName");
		if(NULL == XZX_SetPhotoName) break;
		XZX_SetPhotoNameEx = (Syn_SetPhotoNameEx)GetProcAddress(m_hSubModuleA, "Syn_SetPhotoNameEx");
		if(NULL == XZX_SetPhotoNameEx) break;
		XZX_SetSexType = (Syn_SetSexType)GetProcAddress(m_hSubModuleA, "Syn_SetSexType");
		if(NULL == XZX_SetSexType) break;
		XZX_SetNationType = (Syn_SetNationType)GetProcAddress(m_hSubModuleA, "Syn_SetNationType");
		if(NULL == XZX_SetNationType) break;
		XZX_SetBornType = (Syn_SetBornType)GetProcAddress(m_hSubModuleA, "Syn_SetBornType");
		if(NULL == XZX_SetBornType) break;
		XZX_SetUserLifeBType = (Syn_SetUserLifeBType)GetProcAddress(m_hSubModuleA, "Syn_SetUserLifeBType");
		if(NULL == XZX_SetUserLifeBType) break;
		XZX_SetUserLifeEType = (Syn_SetUserLifeEType)GetProcAddress(m_hSubModuleA, "Syn_SetUserLifeEType");
		if(NULL == XZX_SetUserLifeEType) break;
		//
		//				USBHID函数
		//
		//

		XZX_USBHIDM1Reset = (Syn_USBHIDM1Reset)GetProcAddress(m_hSubModuleA, "Syn_USBHIDM1Reset");
		if(NULL == XZX_USBHIDM1Reset) break;
		XZX_USBHIDM1AuthenKey = (Syn_USBHIDM1AuthenKey)GetProcAddress(m_hSubModuleA, "Syn_USBHIDM1AuthenKey");
		if(NULL == XZX_USBHIDM1AuthenKey) break;
		XZX_USBHIDM1ReadBlock = (Syn_USBHIDM1ReadBlock)GetProcAddress(m_hSubModuleA, "Syn_USBHIDM1ReadBlock");
		if(NULL == XZX_USBHIDM1ReadBlock) break;
		XZX_USBHIDM1WriteBlock = (Syn_USBHIDM1WriteBlock)GetProcAddress(m_hSubModuleA, "Syn_USBHIDM1WriteBlock");
		if(NULL == XZX_USBHIDM1WriteBlock) break;
		XZX_USBHIDM1Halt = (Syn_USBHIDM1Halt)GetProcAddress(m_hSubModuleA, "Syn_USBHIDM1Halt");
		if(NULL == XZX_USBHIDM1Halt) break;
		XZX_USBHIDReadFactoryInfo = (Syn_USBHIDReadFactoryInfo)GetProcAddress(m_hSubModuleA, "Syn_USBHIDReadFactoryInfo");
		if(NULL == XZX_USBHIDReadFactoryInfo) break;
		XZX_USBHIDWriteFactoryInfo = (Syn_USBHIDWriteFactoryInfo)GetProcAddress(m_hSubModuleA, "Syn_USBHIDWriteFactoryInfo");
		if(NULL == XZX_USBHIDWriteFactoryInfo) break;
		XZX_USBHIDReadUserInfo = (Syn_USBHIDReadUserInfo)GetProcAddress(m_hSubModuleA, "Syn_USBHIDReadUserInfo");
		if(NULL == XZX_USBHIDReadUserInfo) break;
		XZX_USBHIDWriteUserInfo = (Syn_USBHIDWriteUserInfo)GetProcAddress(m_hSubModuleA, "Syn_USBHIDWriteUserInfo");
		if(NULL == XZX_USBHIDWriteUserInfo) break;
		XZX_USBHIDGetMaxByte = (Syn_USBHIDGetMaxByte)GetProcAddress(m_hSubModuleA, "Syn_USBHIDGetMaxByte");
		if(NULL == XZX_USBHIDGetMaxByte) break;
		XZX_USBHIDSendSound = (Syn_USBHIDSendSound)GetProcAddress(m_hSubModuleA, "Syn_USBHIDSendSound");
		if(NULL == XZX_USBHIDSendSound) break;
		XZX_USBHIDControlLED = (Syn_USBHIDControlLED)GetProcAddress(m_hSubModuleA, "Syn_USBHIDControlLED");
		if(NULL == XZX_USBHIDControlLED) break;
		XZX_USBHIDControlBeep = (Syn_USBHIDControlBeep)GetProcAddress(m_hSubModuleA, "Syn_USBHIDControlBeep");
		if(NULL == XZX_USBHIDControlBeep) break;
		XZX_USBHIDGetSecCardID = (Syn_USBHIDGetSecCardID)GetProcAddress(m_hSubModuleA, "Syn_USBHIDGetSecCardID");
		if(NULL == XZX_USBHIDGetSecCardID) break;
		XZX_USBHIDSIMpowerOn = (Syn_USBHIDSIMpowerOn)GetProcAddress(m_hSubModuleA, "Syn_USBHIDSIMpowerOn");
		if(NULL == XZX_USBHIDSIMpowerOn) break;
		XZX_USBHIDSIMpowerOff = (Syn_USBHIDSIMpowerOff)GetProcAddress(m_hSubModuleA, "Syn_USBHIDSIMpowerOff");
		if(NULL == XZX_USBHIDSIMpowerOff) break;
		XZX_USBHIDSIMAPDU = (Syn_USBHIDSIMAPDU)GetProcAddress(m_hSubModuleA, "Syn_USBHIDSIMAPDU");
		if(NULL == XZX_USBHIDSIMAPDU) break;
		//XZX_USBHIDReadUserMac = (Syn_USBHIDReadUserMac)GetProcAddress(m_hSubModuleA, "Syn_USBHIDReadUserMac");
		//if(NULL == XZX_USBHIDReadUserMac) break;
		XZX_USBHIDWriteUserMac = (Syn_USBHIDWriteUserMac)GetProcAddress(m_hSubModuleA, "Syn_USBHIDWriteUserMac");
		if(NULL == XZX_USBHIDWriteUserMac) break;
		//add new interface
		//int _stdcall Syn_USBHIDSetTransportType(int iPort,int type);
		XZX_USBHIDSetUserIDCode = (Syn_USBHIDSetUserIDCode)GetProcAddress(m_hSubModuleA, "Syn_USBHIDSetUserIDCode");
		if(NULL == XZX_USBHIDSetUserIDCode) break;
		XZX_USBHIDIsEncryptMode = (Syn_USBHIDIsEncryptMode)GetProcAddress(m_hSubModuleA, "Syn_USBHIDIsEncryptMode");
		if(NULL == XZX_USBHIDIsEncryptMode) break;
		XZX_USBHIDdoUpdate = (Syn_USBHIDdoUpdate)GetProcAddress(m_hSubModuleA, "Syn_USBHIDdoUpdate");
		if(NULL == XZX_USBHIDdoUpdate) break;
		//
		//				USBReade.dll USBHID函数
		//
		//
		//XZX_USBOpenPort = (Syn_USBOpenPort)GetProcAddress(m_hSubModuleA, "Syn_USBOpenPort");
		//if(NULL == XZX_USBOpenPort) break;
		//XZX_USBClosePort = (Syn_USBClosePort)GetProcAddress(m_hSubModuleA, "Syn_USBClosePort");
		//if(NULL == XZX_USBClosePort) break;
		//XZX_USBSetMaxRFByte = (Syn_USBSetMaxRFByte)GetProcAddress(m_hSubModuleA, "Syn_USBSetMaxRFByte");
		//if(NULL == XZX_USBSetMaxRFByte) break;
		//XZX_USBStartFindIDCard = (Syn_USBStartFindIDCard)GetProcAddress(m_hSubModuleA, "Syn_USBStartFindIDCard");
		//if(NULL == XZX_USBStartFindIDCard) break;
		//XZX_USBSelectIDCard = (Syn_USBSelectIDCard)GetProcAddress(m_hSubModuleA, "Syn_USBSelectIDCard");
		//if(NULL == XZX_USBSelectIDCard) break;
		//XZX_USBReadBaseMsg = (Syn_USBReadBaseMsg)GetProcAddress(m_hSubModuleA, "Syn_USBReadBaseMsg");
		//if(NULL == XZX_USBReadBaseMsg) break;
		//XZX_USBReadBaseFPMsg = (Syn_USBReadBaseFPMsg)GetProcAddress(m_hSubModuleA, "Syn_USBReadBaseFPMsg");
		//if(NULL == XZX_USBReadBaseFPMsg) break;
		//XZX_USBReadNewAppMsg = (Syn_USBReadNewAppMsg)GetProcAddress(m_hSubModuleA, "Syn_USBReadNewAppMsg");
		//if(NULL == XZX_USBReadNewAppMsg) break;
		//XZX_USBGetSAMID = (Syn_USBGetSAMID)GetProcAddress(m_hSubModuleA, "Syn_USBGetSAMID");
		//if(NULL == XZX_USBGetSAMID) break;
		//XZX_USBGetSAMIDToStr = (Syn_USBGetSAMIDToStr)GetProcAddress(m_hSubModuleA, "Syn_USBGetSAMIDToStr");
		//if(NULL == XZX_USBGetSAMIDToStr) break;
		//XZX_USBM1Reset = (Syn_USBM1Reset)GetProcAddress(m_hSubModuleA, "Syn_USBM1Reset");
		//if(NULL == XZX_USBM1Reset) break;
		//XZX_USBM1AuthenKey = (Syn_USBM1AuthenKey)GetProcAddress(m_hSubModuleA, "Syn_USBM1AuthenKey");
		//if(NULL == XZX_USBM1AuthenKey) break;
		//XZX_USBM1ReadBlock = (Syn_USBM1ReadBlock)GetProcAddress(m_hSubModuleA, "Syn_USBM1ReadBlock");
		//if(NULL == XZX_USBM1ReadBlock) break;
		//XZX_USBM1WriteBlock = (Syn_USBM1WriteBlock)GetProcAddress(m_hSubModuleA, "Syn_USBM1WriteBlock");
		//if(NULL == XZX_USBM1WriteBlock) break;
		//XZX_USBM1Halt = (Syn_USBM1Halt)GetProcAddress(m_hSubModuleA, "Syn_USBM1Halt");
		//if(NULL == XZX_USBM1Halt) break;
		//XZX_USBReadFactoryInfo = (Syn_USBReadFactoryInfo)GetProcAddress(m_hSubModuleA, "Syn_USBReadFactoryInfo");
		//if(NULL == XZX_USBReadFactoryInfo) break;
		//XZX_USBWriteFactoryInfo = (Syn_USBWriteFactoryInfo)GetProcAddress(m_hSubModuleA, "Syn_USBWriteFactoryInfo");
		//if(NULL == XZX_USBWriteFactoryInfo) break;
		//XZX_USBReadUserInfo = (Syn_USBReadUserInfo)GetProcAddress(m_hSubModuleA, "Syn_USBReadUserInfo");
		//if(NULL == XZX_USBReadUserInfo) break;
		//XZX_USBWriteUserInfo = (Syn_USBWriteUserInfo)GetProcAddress(m_hSubModuleA, "Syn_USBWriteUserInfo");
		//if(NULL == XZX_USBWriteUserInfo) break;
		//XZX_USBGetMaxByte = (Syn_USBGetMaxByte)GetProcAddress(m_hSubModuleA, "Syn_USBGetMaxByte");
		//if(NULL == XZX_USBGetMaxByte) break;
		//XZX_USBSendSound = (Syn_USBSendSound)GetProcAddress(m_hSubModuleA, "Syn_USBSendSound");
		//if(NULL == XZX_USBSendSound) break;
		//XZX_USBControlLED = (Syn_USBControlLED)GetProcAddress(m_hSubModuleA, "Syn_USBControlLED");
		//if(NULL == XZX_USBControlLED) break;
		//XZX_USBControlBeep = (Syn_USBControlBeep)GetProcAddress(m_hSubModuleA, "Syn_USBControlBeep");
		//if(NULL == XZX_USBControlBeep) break;
		//XZX_USBGetSecCardID = (Syn_USBGetSecCardID)GetProcAddress(m_hSubModuleA, "Syn_USBGetSecCardID");
		//if(NULL == XZX_USBGetSecCardID) break;
		//XZX_USBSIMpowerOn = (Syn_USBSIMpowerOn)GetProcAddress(m_hSubModuleA, "Syn_USBSIMpowerOn");
		//if(NULL == XZX_USBSIMpowerOn) break;
		//XZX_USBSIMpowerOff = (Syn_USBSIMpowerOff)GetProcAddress(m_hSubModuleA, "Syn_USBSIMpowerOff");
		//if(NULL == XZX_USBSIMpowerOff) break;
		//XZX_USBSIMAPDU = (Syn_USBSIMAPDU)GetProcAddress(m_hSubModuleA, "Syn_USBSIMAPDU");
		//if(NULL == XZX_USBSIMAPDU) break;
		//XZX_USBReadUserMac = (Syn_USBReadUserMac)GetProcAddress(m_hSubModuleA, "Syn_USBReadUserMac");
		//if(NULL == XZX_USBReadUserMac) break;
		//XZX_USBWriteUserMac = (Syn_USBWriteUserMac)GetProcAddress(m_hSubModuleA, "Syn_USBWriteUserMac");
		//if(NULL == XZX_USBWriteUserMac) break;
		//XZX_USBPSAMpowerOn = (Syn_USBPSAMpowerOn)GetProcAddress(m_hSubModuleA, "Syn_USBPSAMpowerOn");
		//if(NULL == XZX_USBPSAMpowerOn) break;
		//XZX_USBPSAMpowerOff = (Syn_USBPSAMpowerOff)GetProcAddress(m_hSubModuleA, "Syn_USBPSAMpowerOff");
		//if(NULL == XZX_USBPSAMpowerOff) break;
		//XZX_USBPSAMAPDU = (Syn_USBPSAMAPDU)GetProcAddress(m_hSubModuleA, "Syn_USBPSAMAPDU");
		//if(NULL == XZX_USBPSAMAPDU) break;
		//XZX_USBControlFingerLed = (Syn_USBControlFingerLed)GetProcAddress(m_hSubModuleA, "Syn_USBControlFingerLed");
		//if(NULL == XZX_USBControlFingerLed) break;
		XZX_PSAMpowerOn = (Syn_PSAMpowerOn)GetProcAddress(m_hSubModuleA, "Syn_PSAMpowerOn");
		if(NULL == XZX_PSAMpowerOn) break;
		XZX_PSAMpowerOff = (Syn_PSAMpowerOff)GetProcAddress(m_hSubModuleA, "Syn_PSAMpowerOff");
		if(NULL == XZX_PSAMpowerOff) break;
		XZX_PSAMAPDU = (Syn_PSAMAPDU)GetProcAddress(m_hSubModuleA, "Syn_PSAMAPDU");
		if(NULL == XZX_PSAMAPDU) break;
		XZX_ControlFingerLed = (Syn_ControlFingerLed)GetProcAddress(m_hSubModuleA, "Syn_ControlFingerLed");
		if(NULL == XZX_ControlFingerLed) break;
		//add new interface
		//int _stdcall Syn_USBSetTransportType(int iPort,int type);
		//XZX_USBSetUserIDCode = (Syn_USBSetUserIDCode)GetProcAddress(m_hSubModuleA, "Syn_USBSetUserIDCode");
		//if(NULL == XZX_USBSetUserIDCode) break;
		//XZX_USBIsEncryptMode = (Syn_USBIsEncryptMode)GetProcAddress(m_hSubModuleA, "Syn_USBIsEncryptMode");
		//if(NULL == XZX_USBIsEncryptMode) break;
		//XZX_USBdoUpdate = (Syn_USBdoUpdate)GetProcAddress(m_hSubModuleA, "Syn_USBdoUpdate");
		//if(NULL == XZX_USBdoUpdate) break;

		//
		//				串口操作M1卡函数
		//
		//

		XZX_SerialFindReader = (Syn_SerialFindReader)GetProcAddress(m_hSubModuleA, "Syn_SerialFindReader");
		if(NULL == XZX_SerialFindReader) break;
		XZX_SerialOpen = (Syn_SerialOpen)GetProcAddress(m_hSubModuleA, "Syn_SerialOpen");
		if(NULL == XZX_SerialOpen) break;
		XZX_SerialClose = (Syn_SerialClose)GetProcAddress(m_hSubModuleA, "Syn_SerialClose");
		if(NULL == XZX_SerialClose) break;
		XZX_SerialM1Reset = (Syn_SerialM1Reset)GetProcAddress(m_hSubModuleA, "Syn_SerialM1Reset");
		if(NULL == XZX_SerialM1Reset) break;
		XZX_SerialM1AuthenKey = (Syn_SerialM1AuthenKey)GetProcAddress(m_hSubModuleA, "Syn_SerialM1AuthenKey");
		if(NULL == XZX_SerialM1AuthenKey) break;
		XZX_SerialM1WriteBlock = (Syn_SerialM1WriteBlock)GetProcAddress(m_hSubModuleA, "Syn_SerialM1WriteBlock");
		if(NULL == XZX_SerialM1WriteBlock) break;
		XZX_SerialM1Halt = (Syn_SerialM1Halt)GetProcAddress(m_hSubModuleA, "Syn_SerialM1Halt");
		if(NULL == XZX_SerialM1Halt) break;
		XZX_SerialStartFindCPUCard = (Syn_SerialStartFindCPUCard)GetProcAddress(m_hSubModuleA, "Syn_SerialStartFindCPUCard");
		if(NULL == XZX_SerialStartFindCPUCard) break;
		XZX_SerialStartRemoveCPUCard = (Syn_SerialStartRemoveCPUCard)GetProcAddress(m_hSubModuleA, "Syn_SerialStartRemoveCPUCard");
		if(NULL == XZX_SerialStartRemoveCPUCard) break;
		XZX_SerialPCTOCPUCard = (Syn_SerialPCTOCPUCard)GetProcAddress(m_hSubModuleA, "Syn_SerialPCTOCPUCard");
		if(NULL == XZX_SerialPCTOCPUCard) break;
		XZX_SerialSIMpowerOn = (Syn_SerialSIMpowerOn)GetProcAddress(m_hSubModuleA, "Syn_SerialSIMpowerOn");
		if(NULL == XZX_SerialSIMpowerOn) break;
		XZX_SerialSIMpowerOff = (Syn_SerialSIMpowerOff)GetProcAddress(m_hSubModuleA, "Syn_SerialSIMpowerOff");
		if(NULL == XZX_SerialSIMpowerOff) break;
		XZX_SerialSIMAPDU = (Syn_SerialSIMAPDU)GetProcAddress(m_hSubModuleA, "Syn_SerialSIMAPDU");
		if(NULL == XZX_SerialSIMAPDU) break;
		XZX_SerialControlBeep = (Syn_SerialControlBeep)GetProcAddress(m_hSubModuleA, "Syn_SerialControlBeep");
		if(NULL == XZX_SerialControlBeep) break;
		XZX_SerialGetSecCardID = (Syn_SerialGetSecCardID)GetProcAddress(m_hSubModuleA, "Syn_SerialGetSecCardID");
		if(NULL == XZX_SerialGetSecCardID) break;
		XZX_SerialPSAMpowerOn = (Syn_SerialPSAMpowerOn)GetProcAddress(m_hSubModuleA, "Syn_SerialPSAMpowerOn");
		if(NULL == XZX_SerialPSAMpowerOn) break;
		XZX_SerialPSAMpowerOff = (Syn_SerialPSAMpowerOff)GetProcAddress(m_hSubModuleA, "Syn_SerialPSAMpowerOff");
		if(NULL == XZX_SerialPSAMpowerOff) break;
		XZX_SerialPSAMAPDU = (Syn_SerialPSAMAPDU)GetProcAddress(m_hSubModuleA, "Syn_SerialPSAMAPDU");
		if(NULL == XZX_SerialPSAMAPDU) break;
		XZX_SerialControlFingerLed = (Syn_SerialControlFingerLed)GetProcAddress(m_hSubModuleA, "Syn_SerialControlFingerLed");
		if(NULL == XZX_SerialControlFingerLed) break;
		XZX_SerialReadUserInfo = (Syn_SerialReadUserInfo)GetProcAddress(m_hSubModuleA, "Syn_SerialReadUserInfo");
		if(NULL == XZX_SerialReadUserInfo) break;
		XZX_SerialWriteUserInfo = (Syn_SerialWriteUserInfo)GetProcAddress(m_hSubModuleA, "Syn_SerialWriteUserInfo");
		if(NULL == XZX_SerialWriteUserInfo) break;
		//XZX_USBStartFindCPUCard = (Syn_USBStartFindCPUCard)GetProcAddress(m_hSubModuleA, "Syn_USBStartFindCPUCard");
		//if(NULL == XZX_USBStartFindCPUCard) break;
		XZX_StartFindCPUCard = (Syn_StartFindCPUCard)GetProcAddress(m_hSubModuleA, "Syn_StartFindCPUCard");
		if(NULL == XZX_StartFindCPUCard) break;
		//XZX_USBStartRemoveCPUCard = (Syn_USBStartRemoveCPUCard)GetProcAddress(m_hSubModuleA, "Syn_USBStartRemoveCPUCard");
		//if(NULL == XZX_USBStartRemoveCPUCard) break;
		XZX_StartRemoveCPUCard = (Syn_StartRemoveCPUCard)GetProcAddress(m_hSubModuleA, "Syn_StartRemoveCPUCard");
		if(NULL == XZX_StartRemoveCPUCard) break;
		//XZX_USBPCTOCPUCard = (Syn_USBPCTOCPUCard)GetProcAddress(m_hSubModuleA, "Syn_USBPCTOCPUCard");
		//if(NULL == XZX_USBPCTOCPUCard) break;
		XZX_PCTOCPUCard = (Syn_PCTOCPUCard)GetProcAddress(m_hSubModuleA, "Syn_PCTOCPUCard");
		if(NULL == XZX_PCTOCPUCard) break;


		bRet = true;

	} while (0);

	if(!bRet)
	{
		FreeSubModule();
	}
	m_bSubModEnable = bRet;
	//iType 0 = bmp ,1 = jpg , 2 = base64 , 3 = WLT ,4 = 不生成
	XZX_SetPhotoType(4);

	//iType 生成照片文件名 0=tmp 1=姓名 2=身份证号 3=姓名_身份证号 4=指定文件名
	//扩展名按Syn_SetPhotoType(1)设置,base64写成.txt文件
	XZX_SetPhotoName(0);

	//设置照片路径 iOption 路径选项	0=C:	1=当前路径	2=指定路径
	//			cPhotoPath	绝对路径,仅在iOption=2时有效
	//	返回值	0=成功	-1=指定的目录不存在
	char ctmp[256] = { 0 };
	XZX_SetPhotoPath(1, ctmp);

	//iType 0=卡中存储的数据	1=解释之后的数据 2=解释之后加"族"
	XZX_SetNationType(1);

	//iType 0=卡中存储的数据	1=解释之后的数据,男、女、未知
	XZX_SetSexType(1);

	//iType 0=YYYYMMDD,1=YYYY年MM月DD日,2=YYYY.MM.DD,3=YYYY-MM-DD,4=YYYY/MM/DD
	XZX_SetBornType(0);

	//iType 0=YYYYMMDD,1=YYYY年MM月DD日,2=YYYY.MM.DD,3=YYYY-MM-DD,4=YYYY/MM/DD
	XZX_SetUserLifeBType(3);

	//iType   0=YYYYMMDD(不转换),1=YYYY年MM月DD日,2=YYYY.MM.DD,3=YYYY-MM-DD,4=YYYY/MM/DD,
	//iOption 0=长期 不转换,	1=长期转换为 有效期开始+50年
	XZX_SetUserLifeEType(3, 0);
	return bRet;
}

int IDCardXZX::FindUSBDriverDevice() 
{
	int nRet;

	for (int i = 1001; i < 1017; i++)
	{
		nRet = XZX_OpenPort(i);
		if (nRet == 0)
		{
			//nRet = Syn_GetSAMStatus(i, 0);
			if (nRet == 0)
			{
				XZX_ClosePort(i);
				return i;
			}
			XZX_ClosePort(i);
		}
	}
	return 0;
}

// -1:动态库加载失败 -2:没有找到读卡器 -3:读卡器连接在串口 -4:打开端口错误 -5:获取最大通信字节数失败 -6:端口9999异常
int IDCardXZX::FindCard()
{
	unsigned char nARMVol;
	unsigned int uiCurrBaud;
	int nRet,nRet2;
	if(!LoadSubModule()) return -1;
	nRet = FindUSBDriverDevice();
	if (nRet == 0) return -2;
	Sleep(100);
	m_iPort = nRet;
	if (nRet <= 1000)
	{
		Sleep(200);
		nRet2 = XZX_GetCOMBaud( nRet ,&uiCurrBaud);
		m_CurrBaud = uiCurrBaud;
		return -3;
	}

	if (m_iPort == 9999)
	{
		int ret = -6;
		do 
		{
			nRet = XZX_OpenPort(m_iPort);
			if(nRet!=0){
				ret = -4;
				break;
			}

			nRet = XZX_USBHIDGetMaxByte(m_iPort,&m_iMaxByte,&nARMVol);
			if(nRet!=0){
				ret = -5;
				break;
			}
		} while (0);
		nRet = XZX_ClosePort(m_iPort);
		return ret;
	}
	return 0;
}

// -7:eRR1 -8:eRR2 -9:eRR3 -10:照片解码错误 -11:完整过程读取身份证信息错误 -12:找卡错误 -13:选卡错误
int IDCardXZX::ReadCardInfo()
{
	CString sMsg,sMsg2;
	int nRet;
	unsigned int uiCurrBaud;

	nRet = FindCard();
	if (nRet == -2) {
		if (link) {
			link = false;
			return 100;
		}
	}
	else {
		if (!link) {
			link = true;
			return 200;
		}
	}
	if(nRet != 0) return nRet;

	unsigned char pucIIN[4];
	unsigned char pucSN[8];

	try
	{
		nRet = XZX_OpenPort(m_iPort);

		//Syn_USBSetTransportType(m_iPort,((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck());
		if (nRet == 0)
		{
			nRet = XZX_StartFindIDCard(m_iPort,pucIIN,0);
			if (nRet != 0) {
				XZX_ClosePort(m_iPort);
				return -12;
			}
			Sleep(50);
			nRet = XZX_SelectIDCard(m_iPort,pucSN,0);
			if(nRet != 0) 
			{
				XZX_ClosePort(m_iPort);
				return -13;
			}
			Sleep(50);
			nRet = XZX_ReadMsg(m_iPort,0,&m_idcardData);
			if (m_iReadStart==1)
			{
				m_iReadSum++;
			}
			if (nRet == 0 || nRet==1)// nRet==1时照片解码错误,可能是c盘根目录下没有License.dat文件
			{
				if (m_iReadStart == 1)
				{
					m_iReadOKSum++;
					XZX_ClosePort(m_iPort);
					return -10;
				}
			}
			else
			{
				m_errNum = nRet;
				XZX_ClosePort(m_iPort);
				return -11;
			}
		}
		else
		{
			return -4;
		}
		if (m_iPort>0)
		{
			XZX_ClosePort(m_iPort);
		}
	}
	catch (CMemoryException* e)
	{
		e->Delete();
		return -7;
	}
	catch (CFileException* e)
	{
		e->Delete();
		return -8;
	}
	catch (CException* e)
	{
		e->Delete();
		return -9;
	}
	return 0;
}

CString IDCardXZX::Age()
{
	CString str(m_idcardData.Born);
	if(str == "") return "";
	CString strRes;
	CTime m_time;
	m_time = CTime::GetCurrentTime();
	CString strYear = m_time.Format(_T("%Y"));
	CString strMonth = m_time.Format(_T("%m"));
	CString strDay = m_time.Format(_T("%d"));
	CString birYear = str.Mid(0,4);
	CString birMonth = str.Mid(4,2);
	CString birDay = str.Mid(6,2);

	int res = 0;

	if( (atoi(strMonth) > atoi(birMonth)) ||
		((atoi(strMonth) >= atoi(birMonth)) && (atoi(strDay) >= atoi(birDay)))){
		res = atoi(strYear) - atoi(birYear);
	}else{
		res = atoi(strYear) - atoi(birYear) - 1;
	}
	strRes.Format("%d",res);

	return strRes;
}

void IDCardXZX::ClearIdCardInfo()
{
	memset(&m_idcardData.Name,0,sizeof(m_idcardData.Name));
	memset(&m_idcardData.Sex,0,sizeof(m_idcardData.Sex));
	memset(&m_idcardData.Nation,0,sizeof(m_idcardData.Nation));
	memset(&m_idcardData.Born,0,sizeof(m_idcardData.Born));
	memset(&m_idcardData.Address,0,sizeof(m_idcardData.Address));
	memset(&m_idcardData.IDCardNo,0,sizeof(m_idcardData.IDCardNo));
	memset(&m_idcardData.GrantDept,0,sizeof(m_idcardData.GrantDept));
	memset(&m_idcardData.UserLifeBegin,0,sizeof(m_idcardData.UserLifeBegin));
	memset(&m_idcardData.UserLifeEnd,0,sizeof(m_idcardData.UserLifeEnd));
	memset(&m_idcardData.PassID,0,sizeof(m_idcardData.PassID));
	memset(&m_idcardData.IssuesTimes,0,sizeof(m_idcardData.IssuesTimes));
	memset(&m_idcardData.reserved,0,sizeof(m_idcardData.reserved));
	memset(&m_idcardData.PhotoFileName,0,sizeof(m_idcardData.PhotoFileName));
	memset(&m_idcardData.CardType,0,sizeof(m_idcardData.CardType));
	memset(&m_idcardData.EngName,0,sizeof(m_idcardData.EngName));
	memset(&m_idcardData.CertVol,0,sizeof(m_idcardData.CertVol));
}

3、调用实例

int res = IDCardHelper::Instance()->ReadCardInfo();
if (res == 0) {
    CString m_ID = IDCardHelper::Instance()->IdNo();
    CString m_Name = IDCardHelper::Instance()->Name();
    CString m_Sex = IDCardHelper::Instance()->Sex();
    CString m_Age = IDCardHelper::Instance()->Age();
}
else if (res == 100) {
    AfxMessageBox("身份证阅读器连接异常,请重新插拔");
}
else if (res == 200) {
    AfxMessageBox("身份证阅读器连接正常");
}

 技术交流请加群:996775415

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝卜兽编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值