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);
}
解决方案 »
- 一个窗体如何控调用另一个窗体中的过程?
- 崩溃中,delphi调用dll的问题
- 有谁知道Win2003/WinXP启动画面的那种进度条那种控件包里有?
- 求胜天进销存源码!!!!!!!!!
- 如何通过程序设置QuickReport的纸张大小。
- HTML文件的预览
- ActiveForm的问题!!进者有分!100!急!
- 高分求教,在delphi中如何用TServerSocket控件的多线程阻塞?
- 不用SQL如何进行数据查找、如何得到网页源码?(限制条件)
- firing_sky,yjg,ftao,Laozheng,east_sun,kxy请来拿分
- delphi 中的adoquery1中的timieout必须要设置为0么
- 关于结构体指针
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; //直接显示照片
}
其中把日志的部分当成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;