#读取二代身份证信息源码2007-09-18 14:46   public static extern int GetBmp(string file_name, int intf);   public delegate void De_ReadICCardComplete(clsEDZ objEDZ);
   public event De_ReadICCardComplete ReadICCardComplete;
   private clsEDZ objEDZ = new clsEDZ();
   private int EdziIfOpen = 1;                //自动开关串口
   int EdziPortID;        
   public clsICCard()
   {   }
   public bool ReadICCard()
   {           
    bool bUsbPort = false;
    int intOpenPortRtn = 0;
    int rtnTemp = 0;
    int pucIIN = 0;
    int pucSN = 0;
    int puiCHMsgLen = 0;
    int puiPHMsgLen = 0;    objEDZ = new clsEDZ();
    //检测usb口的机具连接,必须先检测usb
    for (int iPort = 1001; iPort <= 1016; iPort++)
    {
     intOpenPortRtn = SDT_OpenPort(iPort);
     if (intOpenPortRtn == 144)
     {
      EdziPortID = iPort;
      bUsbPort = true;
      break;
     }
    }
    //检测串口的机具连接
    if (!bUsbPort)
    {
     for (int iPort = 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);
     return false;
    }
    //在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把 EdziPortID 保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,
    //您要考虑机具连接端口被用户改变的情况哦    //下面找卡
    rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen);
    if (rtnTemp != 159)
    {
     rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen);   //再找卡
     if (rtnTemp != 159)
     {                                   
      rtnTemp = SDT_ClosePort(EdziPortID);
      MessageBox.Show("未放卡或者卡未放好,请重新放卡!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return false;
     }
    }
    //选卡
    rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen);
    if (rtnTemp != 144)
    {
     rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen);   //再选卡
     if (rtnTemp != 144)
     {                                      
      rtnTemp = SDT_ClosePort(EdziPortID);
      MessageBox.Show("读卡失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return false;
     }
    }
    //注意,在这里,用户必须有应用程序当前目录的读写权限
    FileInfo objFile = new FileInfo("wz.txt");
    if (objFile.Exists)
    {
     objFile.Attributes = FileAttributes.Normal;
     objFile.Delete();
    }
    objFile = new FileInfo("zp.bmp");
    if (objFile.Exists)
    {
     objFile.Attributes = FileAttributes.Normal;
     objFile.Delete();
    }
    objFile = new FileInfo("zp.wlt");
    if (objFile.Exists)
    {
     objFile.Attributes = FileAttributes.Normal;
     objFile.Delete();
    }
    rtnTemp = SDT_ReadBaseMsgToFile(EdziPortID, "wz.txt", ref puiCHMsgLen, "zp.wlt", ref puiPHMsgLen, EdziIfOpen);
    if (rtnTemp != 144)
    {                        
     rtnTemp = SDT_ClosePort(EdziPortID);
     MessageBox.Show("读卡失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
     return false;
    }
    //下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,照片解析将会失败
    if (bUsbPort)
     rtnTemp = GetBmp("zp.wlt", 2);
    else
     rtnTemp = GetBmp("zp.wlt", 1);
    switch (rtnTemp)
    {
     case 0:
      MessageBox.Show("调用sdtapi.dll错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
      break;
     case 1:    //正常
      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);
    FileInfo f = new FileInfo("wz.txt");
    FileStream fs = f.OpenRead();
    byte[] bt = new byte[fs.Length];
    fs.Read(bt, 0, (int)fs.Length);
    fs.Close();    string str = 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();
    string strBird = 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.IDC = System.Text.UnicodeEncoding.Unicode.GetString(bt, 122, 36).Trim();
    objEDZ.REGORG = System.Text.UnicodeEncoding.Unicode.GetString(bt, 158, 30).Trim();
    string strTem = System.Text.UnicodeEncoding.Unicode.GetString(bt, 188, bt.GetLength(0) - 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 = new FileInfo("zp.bmp");
    if (objFile.Exists)
    {
     Image img = Image.FromFile("zp.bmp");
     objEDZ.PIC_Image=(Image)img.Clone();
     System.IO.MemoryStream m = new MemoryStream();
     img.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);
     objEDZ.PIC_Byte = m.ToArray();
     img.Dispose();
     img = null;
    }
    ReadICCardComplete(objEDZ);           
    return true;
   }
}
邮箱:[email protected]