public class IDCardAPI
{
private const string ApiPath = "widapi.dll";
//private const string ApiPath = "widapi_x64.dll";
// 初始化端口,port:USB: 1001~1006, 串口:1~16 返回1成功,<0失败
[DllImport(ApiPath, EntryPoint = "InitComm", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int InitComm(int port);
// 查找并初始化端口,打开成功时返回 USB: 1001~1006, 串口:1~16, <0失败
[DllImport(ApiPath, EntryPoint = "InitCommExt", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int InitCommExt();
// 关闭端口,返回1成功,0失败
[DllImport(ApiPath, EntryPoint = "CloseComm", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int CloseComm();
// 读取安全模块编号,预分配64字节空间
[DllImport(ApiPath, EntryPoint = "GetSAMIDToStr", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int GetSAMIDToStr(byte[] samID);
// 身份证卡认证,1--卡认证成功,<0认为失败
[DllImport(ApiPath, EntryPoint = "Authenticate", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int Authenticate();
// 读文字信息 readNewAddress: 0x01--额外读取最新地址信息,0x00--不读取最新地址。
// directoryPath--保存photo相片文件的路径,为null表示不生成相片图像文件。
// 返回:1--成功,<0失败
[DllImport(ApiPath, EntryPoint = "ReadBaseMsgData", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int ReadBaseMsgData(int readNewAddress, string directoryPath, ref IDCARDPERSONINFO personinfo);
// 读文字信息及指纹信息 readNewAddress: 0x01--额外读取最新地址信息,0x00--不读取最新地址。
// directoryPath--保存photo相片文件的路径,为null表示不生成相片图像文件。
// 返回:1--成功,<0失败
[DllImport(ApiPath, EntryPoint = "ReadBaseFPMsgData", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int ReadBaseFPMsgData(int readNewAddress, string directoryPath, ref IDCARDPERSONINFO personinfo);
// 读最新地址信息 newAddress--预分配72字节空间,返回1成功,<0失败
[DllImport(ApiPath, EntryPoint = "ReadNewAddress", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int ReadNewAddress(byte[] newAddress);
// 解码相片数据 wltData--原始相片文件,destDataType --目标数据类型,1--24位色bmp文件
// destFilePath--目标图像文件路径,为null表示不生成图像文件,
// destBuf--目标图像数据,需预分配足够大小的空间,建议分配60 * 1024字节的缓冲区,为null表示不生成图像数据
// destBufLen--传入预分配的缓冲区大小,返回实际数据大小。
// 返回1成功,<0失败
[DllImport(ApiPath, EntryPoint = "DecodeWltData", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int DecodeWltData(byte[] wltData, int destDataType, string destFilePath, byte[] destBuf, ref int destBufLen);
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct IDCARDPERSONINFO64
{
public int iCardType;//卡片类型 1-居民身份证 2-外国人永久居住证 3-港澳通行证
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string name; // 姓名
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sex; // 性别,汉字表示
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string nation; // 民族,汉字表示
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string birthdate; // 出生年月日 格式yyyymmdd
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
public string address; // 住址
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string idCode; // 公民身份代码
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string agency; // 签发机关
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string validBegin; // 有效期限起,格式yyyymmdd
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string validEnd; // 有效期限止,格式yyyymmdd或“长期”
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
public string newAddress; // 最新住址
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string sexCode; // 性别代码
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string nationCode; // 民族代码
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public byte[] wzData; // 原始机读文字信息
public int wzDataLen; // 原如机读文字信息长度
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public byte[] fpData; // 原始机读指纹信息
public int fpDataLen; // 原始机读指纹信息长度,-1表示该阅读器不支持指纹信息的读取
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public byte[] wltData; // 原始机读相片信息
public int wltDataLen; // 原始机读相片信息长度
//2.外国人居留证数据(iCardType=2)
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 120)]
public string szfname;//姓名
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string szfsex;//性别
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string szfID;//永久居留证号码
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string szfnation;//国籍代码
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string szfcnName;//中文姓名
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szfusefulBegin;//证件签发日期
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szfusefulEnd;//证件终止日期
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szfbirthday;//出生日期
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string szfver;//证件版本号
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string szforgan;//当次申请受理机关代码
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string szfflag;//证件类型标志
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string szfReserve;//预留项
//3.港澳台居住证数据(iCardType=3)
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string szHMTName;//姓名
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string szHMTSex;//性别
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string szHMTRes1;//预留
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szHMTBirthday;//生日
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 70)]
public string szHMTAddr;//住址
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
public string szHMTID;//身份证号码
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string szHMTOrgan;//签发机关
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szHMTBegindate;//有效期起始日期起
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szHMTEndDate;//有效期截止日期
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
public string szHMTPassCode;//通行证号码
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string szHMTSignFrequency;//签发次数
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string szHMTRes2;//预留区
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string szHMTFlag;//证件类型标志
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string szHMTRes3;//预留区
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct IDCARDPERSONINFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sex;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string nation;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string birthdate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
public string address;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string idCode;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string agency;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string validBegin;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string validEnd;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
public string newAddress;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string sexCode;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string nationCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public byte[] wzData;
public int wzDataLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public byte[] fpData;
public int fpDataLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public byte[] wltData;
public int wltDataLen;
}