void CDemoVCDlg::OnButton5() 
{
    //读身份证卡
    int nRet,i;
    CString ss,ss1;
    BYTE buf[2048];
    if(pOneCommand==NULL)
    {
        m_strEdit.Insert(0,"没有初始化通讯库\r\n");
        UpdateData(FALSE);
        return;
    }    nRet=pOneCommand(PICC_RDRead,0,buf,TYPE_ID2,1500);      //注意超时时间这里为1.5秒
    if(nRet>0)
    {
        ss="";
        for(i=0;i<nRet;i++)
        {
            ss1.Format("%02X ",buf[i]);
            ss+=ss1;
        }
        ss+="\r\n";
        m_strEdit.Insert(0,ss);
        if(buf[0]==0x00 && buf[1]==0x00 && buf[2]==0x90)    //一般只判断成功即可
        {
            //身份证读取成功,显示信息
            //前256字节为文本,后1024位加密压缩照片
            //文本
            char byName[32],bySex[4],byFolk[6],byBirth[18],byAddr[72],byIDNum[38],byDep[32],byBegin[18],byEnd[18];
            memset(byName   ,0,32);
            memset(bySex   ,0,4);
            memset(byFolk   ,0,6);
            memset(byBirth   ,0,18);
            memset(byAddr   ,0,72);
            memset(byIDNum   ,0,38);
            memset(byDep   ,0,32);
            memset(byBegin   ,0,18);
            memset(byEnd   ,0,18);
            int n;
            n=7;
            memcpy(byName,  &buf[ n],30);n+=30;
            memcpy(bySex ,  &buf[ n], 2);n+=2;
            memcpy(byFolk , &buf[ n], 4);n+=4;
            memcpy(byBirth, &buf[ n],16);n+=16;
            memcpy(byAddr,  &buf[ n],70);n+=70;
            memcpy(byIDNum, &buf[ n],36);n+=36;
            memcpy(byDep,   &buf[ n],30);n+=30;
            memcpy(byBegin, &buf[ n],16);n+=16;
            memcpy(byEnd,   &buf[ n],16);n+=16;            ss=::SysAllocString((LPCWSTR)&byEnd);
            ss.TrimRight();
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&byBegin);
            ss.TrimRight();
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&byDep);
            ss.TrimRight();
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&byIDNum);
            ss.TrimRight();
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&byAddr);
            ss.TrimRight();
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&byBirth);
            ss.TrimRight();
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&byFolk);
            ss.TrimRight();
            ss=FOLK[atoi(ss.GetBuffer(ss.GetLength()))];
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&bySex); //(CW2A((LPCWSTR)&bySex));
            ss.TrimRight();
            if(ss=="1")
            {
                ss="男";
            }
            else
            {
                ss="女";
            }
            m_strEdit.Insert(0,ss+"\r\n");
            ss=::SysAllocString((LPCWSTR)&byName);
            ss.TrimRight();
            m_strEdit.Insert(0,ss+"\r\n");
            UpdateData(FALSE);
            //照片,保存为文件
            if(m_hBitmap!=NULL)
            {
                DeleteObject(m_hBitmap);
            }
    
            int nRet=0;
            FILE *fp;
            char filename[128];            //ss:=ExtractFilePath(Application.ExeName)+'b.bmp';
            TCHAR exePath[128];    
            GetModuleFileName(NULL,exePath,128);
            CString sPath;
            sPath.Format("%s",exePath);
            for(int i=sPath.GetLength();i>0;i--)
            {
                if(exePath[i]==0x5c)
                {
                    exePath[i+1]=0x00;
                    break;
                }
            }
    
            sprintf(filename,"%szp.wlt",exePath);
            //保存文件
            fp=fopen(filename, "w+b");
            if( fp!=NULL )
            {
                fwrite(&buf[7+256],1024, 1, fp);
                fclose(fp);
            }
            else
            {
                return;
            }
            //解码
            nRet=Ftest(filename);
            if(nRet==1)
            {
                //读取文件显示
                sprintf(filename,"%szp.bmp",exePath);
                m_hBitmap=(HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
                if(m_hBitmap!=NULL )
                {
                    m_ctBmp.SetBitmap(m_hBitmap);
                    m_ctBmp.ShowWindow(SW_SHOW);
                }
                else
                {
                    m_ctBmp.ShowWindow(SW_HIDE);
                }
            }
            else
            {
                 m_ctBmp.ShowWindow(SW_HIDE);
                 m_strEdit.Insert(0,"照片解码错误\r\n");
            }            m_strEdit.Insert(0,"读身份证卡成功\r\n");
        }
        else
        {
            m_strEdit.Insert(0,"读身份证卡失败\r\n");
        }
    }
    else
    {
        m_strEdit.Insert(0,"读身份证卡失败,未收到数据\r\n");
    }
    UpdateData(FALSE);        
}

解决方案 »

  1.   

    里面那个解码照片的函数:typedef int (PASCAL *pFun1)(char *,int);
    pFun1 pFun;
    int Ftest(char *sfile)
    {
        //。。
            HINSTANCE hModule;
        hModule=LoadLibrary(_T("GetInfo.dll"));        if(hModule ==NULL )
        {
        //AfxMessageBox(_T("加载动态库失败"));
        return -1;
        }
        pFun =(pFun1)GetProcAddress(hModule,_T("GetBmp"));
        if( (pFun==NULL) )
        {
        //AfxMessageBox(_T("获取函数失败"));     return -2;
        }
        int hbp;
        hbp=pFun(sfile,1);
        FreeLibrary(hModule);
        hModule=NULL;
            //。。    return hbp;     //直接显示照片
    }
      

  2.   

    大概的转换,只便于理解,仅供参考.
    其中把日志的部分当成TMemo,图片的部分自己处理.
    procedure memset(var x;Value: Char;count: Integer);
    begin
      fillchar(x,count,Value);
    end;
    procedure memcpy(var Dest;const Source;  count : Integer);
    begin
      move(Source,Dest,Count);
    end;
    procedure CDemoVCDlg.OnButton5;
    var
        //读身份证卡
      nRet,i: Integer;
      ss,ss1: AnsiString;
      buf: array[0..2048-1] of Byte;  byName: array[0..32-1] of AnsiChar;
      bySex: array[0..4-1] of AnsiChar;
      byFolk: array[0..6-1] of AnsiChar;
      byBirth: array[0..18-1] of AnsiChar;
      byAddr: array[0..72-1] of AnsiChar;
      byIDNum: array[0..38-1] of AnsiChar;
      byDep: array[0..32-1] of AnsiChar;
      byBegin: array[0..18-1] of AnsiChar;
      byEnd: array[0..18-1] of AnsiChar;  n: Integer;
      fp: TFileStream;
      filename: AnsiString;
    begin
      if(Not Assigned(pOneCommand)) then begin
        m_strEdit.Lines.Insert(0,'没有初始化通讯库');
        UpdateData(FALSE);
        Exit;
      end;  nRet := pOneCommand(PICC_RDRead,0,buf,TYPE_ID2,1500);      //注意超时时间这里为1.5秒  if(nRet>0) then begin
        ss:='';    for i:=0 to nRet-1 do begin
          ss := ss + Format('%02X ',[buf[i]]);
        end;    m_strEdit.Lines.Insert(0,ss);    if(buf[0]=$00) and (buf[1]=$00) and (buf[2]=$90) then    //一般只判断成功即可      //身份证读取成功,显示信息
          //前256字节为文本,后1024位加密压缩照片
          //文本      memset(byName   ,0,32);
          memset(bySex   ,0,4);
          memset(byFolk   ,0,6);
          memset(byBirth   ,0,18);
          memset(byAddr   ,0,72);
          memset(byIDNum   ,0,38);
          memset(byDep   ,0,32);
          memset(byBegin   ,0,18);
          memset(byEnd   ,0,18);      n:=7;
          memcpy(byName,  buf[ n],30);inc(n,30);
          memcpy(bySex ,  buf[ n], 2);inc(n,2);
          memcpy(byFolk , buf[ n], 4);inc(n,4);
          memcpy(byBirth, buf[ n],16);inc(n,16);
          memcpy(byAddr,  buf[ n],70);inc(n,70);
          memcpy(byIDNum, buf[ n],36);inc(n,36);
          memcpy(byDep,   buf[ n],30);inc(n,30);
          memcpy(byBegin, buf[ n],16);inc(n,16);
          memcpy(byEnd,   buf[ n],16);inc(n,16);      ss:=TrimRight(byEnd);
          m_strEdit.Lines.Insert(0,ss);      ss:=TrimRight(byBegin);
          m_strEdit.Lines.Insert(0,ss);      ss:=TrimRight(byDep);
          m_strEdit.Lines.Insert(0,ss);      ss:=TrimRight(byIDNum);
          m_strEdit.Lines.Insert(0,ss);      ss:=TrimRight(byAddr);
          m_strEdit.Lines.Insert(0,ss);      ss:=TrimRight(byBirth);
          m_strEdit.Lines.Insert(0,ss);      ss:=TrimRight(byFolk);
          ss:=FOLK[strToInt(ss)];
          m_strEdit.Lines.Insert(0,ss);
          ss:=TrimRight(bySex); //(CW2A((LPCWSTR)&bySex));      if(ss='1') then begin
              ss:='男';
          end else begin
              ss:='女';
          end;
          m_strEdit.Lines.Insert(0,ss);      ss:=TrimRight(byName);
          m_strEdit.Lines.Insert(0,ss);
          UpdateData(FALSE);      //照片,保存为文件
          if(m_hBitmap<>0) then begin
            DeleteObject(m_hBitmap);
          end;      nRet := 0;
          filename := ExtractFilePath(ParamStr(0)) + 'zp.wlt';
          fp := TFileStream.Create(filename,fmOpenWrite);
          try
            fp.write(buf[7+256],1024);
          finally
            fp.Free;
          end;      //解码
          nRet:=Ftest(PAnsiChar(filename));
          if(nRet=1) then begin
            //读取文件显示
            filename := ExtractFilePath(ParamStr(0)) + 'zp.bmp';        m_hBitmap:=HBITMAP(LoadImage(0,PAnsiChar(filename),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION or LR_DEFAULTSIZE or LR_LOADFROMFILE));
            if(m_hBitmap=0 ) then
              m_ctBmp.SetBitmap(m_hBitmap);
              m_ctBmp.ShowWindow(SW_SHOW);
            end else begin
              m_ctBmp.ShowWindow(SW_HIDE);
            end;
          end else begin
            m_ctBmp.ShowWindow(SW_HIDE);
            m_strEdit.Lines.Insert(0,'照片解码错误');
          end;      m_strEdit.Lines.Insert(0,'读身份证卡成功');
        end else begin
          m_strEdit.Lines.Insert(0,'读身份证卡失败');
        end;
      end else begin
        m_strEdit.Lines.Insert(0,'读身份证卡失败,未收到数据');
      end;
      UpdateData(FALSE);
    end;
    //typedef int (PASCAL *pFun1)(char *,int);
    type
      pFun1 = function(p1: PAnsiChar ;p2: Integer): Integer; stdcall;
    var
      pFun: pFun1 ;
    function Ftest(sfile: PAnsiChar): Integer;
    var
        //。。
      _hModule: HMODULE;
    begin
      _hModule := LoadLibrary('GetInfo.dll');  if(hModule = 0 ) then begin
        //ShowMessage('加载动态库失败');
        Result :=-1;
        Exit;
      end;
            
      pFun :=pFun1(GetProcAddress(_hModule,'GetBmp'));
      if( Not Assigned(pFun) ) then begin
        //ShowMessage('获取函数失败');
        Result := -2;
        Exit;
      end;
      Result := pFun(sfile,1);
      FreeLibrary(_hModule);
      //。。
    end;