版本:
delphi 10.3
调用的读卡库:donsee32.dll
Delphi语言读取效果图用到的读卡器型号:EST-100R多功能智能卡读写器模组
导入读卡函数
unit Ucard;
interface
type
PIDINFO=^IDINFO;
IDINFO = record //身份证信息结构体
Name:array[0..39] of AnsiChar; //中文姓名 40长度
ENfullname:array[0..39] of AnsiChar; //英文姓名 40长度
Sex:array[0..9] of AnsiChar; //性别 10长度
people:array[0..19] of AnsiChar; //民族 20长度
address:array[0..199] of AnsiChar; //地址 200长度
birthday:array[0..49] of AnsiChar; //出生日期(YYYYMMDD) 50长度
signdate:array[0..49] of AnsiChar; //发证日期(YYYYMMDD) 50长度
validterm:array[0..49] of AnsiChar; //有效日期(YYYYMMDD) 50长度
number:array[0..39] of AnsiChar; //证件号码 40长度
organs:array[0..49] of AnsiChar; //发证机关(或外国人永久居住正-当次申请受理机关) 50长度
Nationality:array[0..199] of AnsiChar; //国籍 200长度
Photo:array[0..2048] of AnsiChar; //读取二代证电子信息时保存照片数据信息 2049长度
Other:array[0..199] of AnsiChar; //其他 200长度
passNu:array[0..23] of AnsiChar; //通行证号 24长度
signCount:array[0..7] of AnsiChar; //签发数次 8长度
certVersion:array[0..7] of AnsiChar; //证件版本 8长度
certType:array[0..6] of AnsiChar; //卡片类型:"0"大陆身份证 "I"外国人 "J"港澳台 6长度
figData:array[0..2048] of AnsiChar; //指纹信息 2049长度
end;
PSSCard_IDINFO=^SSCard_IDINFO;
SSCard_IDINFO=record //社保卡信息结构体*/
name:array[0..39] of AnsiChar; //姓名 40长度
sex:array[0..9] of AnsiChar;//性别 10长度
nation:array[0..19] of AnsiChar;//民族 20长度
birthday:array[0..49] of AnsiChar; //出生日期 50长度
signdate:array[0..49] of AnsiChar;//发证日期(YYYYMMDD 50长度
validterm:array[0..49] of AnsiChar; //有效日期(YYYYMMDD 50长度
cardnumber:array[0..39] of AnsiChar;//卡号 40长度
idnumber:array[0..39] of AnsiChar; //社会保障号码(身份证号) 40长度
city:array[0..63] of AnsiChar; //*城市代码 64长度
cardveVrsion:array[0..7] of AnsiChar;//社保卡版本 8长度
identityCode:array[0..63] of AnsiChar;//卡识别码 64长度
szTerminalNo:array[0..31] of AnsiChar; //SAM卡识别号 32长度
Other:array[0..199] of AnsiChar;//其他 200长度
end;
//donsee32.dll API声明 WltRS.dll需和donsee32.dll放同一目录
//打开设备
function Donsee_Open(szDevName: PAnsiChar): Integer; stdcall; far; external 'donsee32.dll' name 'Donsee_Open';
//关闭设备
function Donsee_Close(): Integer; stdcall; far; external 'donsee32.dll' name 'Donsee_Close';
//调用蜂鸣器
function Donsee_Beep(): Integer; stdcall; far; external 'donsee32.dll' name 'Donsee_Beep';
//读取版本号
function Donsee_Version(pszVersion: PAnsiChar): Integer; stdcall; far; external 'donsee32.dll' name 'Donsee_Version';
//读取身份证加照片
function Donsee_ReadIDCard(nType:Integer; szPath:AnsiString; idInfo:PIDINFO; pszMsg:PAnsiChar): Integer; stdcall; far; external 'donsee32.dll' name 'Donsee_ReadIDCard';
//读取身份证ID
function Donsee_ReadIDCardUid(pszUID: PAnsiChar): Integer; stdcall; far; external 'donsee32.dll' name 'Donsee_ReadIDCardUid';
//读取社保卡
function Donsee_ReadSSCard(nSlotPsam:Integer;cardInfo:PSSCard_IDINFO; arrChMsg:PAnsiChar): Integer; stdcall; far; external 'donsee32.dll' name 'Donsee_ReadSSCard';
implementation
end.
读身份证代码:
procedure TForm1.Button2Click(Sender: TObject);
var
t_nRe:Integer;
t_nType:Integer;
t_szPicPath:PAnsiChar;
t_arrChMsg:PAnsiChar;
jpgtem:TJPEGImage;
AnsiStringtemp:AnsiString;
sfzCard:IDINFO;
begin
//读取身份证
if (IsOpenReader) then
begin
t_nRe := 99;
t_nType := 1; //设置身份证读卡类型:0,文本信息;1,文本 + 照片;2,文本 + 照片 + 指纹,不读指纹读卡速度更快一些!
t_szPicPath:='IDphoto.jpg'; //定义相片名称
t_arrChMsg:= AnsiStrAlloc(256); //返回的错误信息
t_nRe := Donsee_ReadIDCard(t_nType, t_szPicPath, @sfzCard, t_arrChMsg); //注意结构体入参 Donsee_ReadIDCard
if t_nRe = 0 then
begin
Donsee_Beep();
if (Trim(sfzCard.certType) = 'I') then//外国人永久居留身份证
begin
Memo1.Lines.Add('读取成功,证件类型:外国人身份证');
Memo1.Lines.Add('证件类型标识:' + trim(sfzCard.certType));
Memo1.Lines.Add('英文姓名:' + Trim(sfzCard.ENfullname));
Memo1.Lines.Add('性 别:' + sfzCard.sex);
Memo1.Lines.Add('永久居留证号码:' + sfzCard.number );
Memo1.Lines.Add('国籍或所在地区代码:' + sfzCard.Nationality);
Memo1.Lines.Add('中文姓名:'+ sfzCard.name );
Memo1.Lines.Add('证件签发日期:' + sfzCard.signdate );
Memo1.Lines.Add('证件终止日期:' + sfzCard.validterm );
Memo1.Lines.Add('出生日期:' + sfzCard.birthday );
Memo1.Lines.Add('证件版本号:' + sfzCard.certVersion );
Memo1.Lines.Add('申请机关代码:' + sfzCard.organs);
if (t_nType <> 0) then //读取照片加指纹
begin
Memo1.Lines.Add('照片原始数据:' + leftstr(sfzCard.Photo,50) + '...');
end
//外国人居住证没有指纹数据
end
else if (Trim(sfzCard.certType)= 'J') then//港澳台居民居住证
begin
Memo1.Lines.Add('读取成功,证件类型:港澳台居住证');
Memo1.Lines.Add('证件类型标识:' + Trim(sfzCard.certType));
Memo1.Lines.Add('姓名:' + sfzCard.name);
Memo1.Lines.Add('性别:' + sfzCard.sex );
Memo1.Lines.Add('出生日期:' + sfzCard.birthday);
Memo1.Lines.Add('住址:' + sfzCard.address );
Memo1.Lines.Add('公民身份号码:' + sfzCard.number );
Memo1.Lines.Add('签发机关:' + sfzCard.organs);
Memo1.Lines.Add('有效期起始日期:' + sfzCard.signdate);
Memo1.Lines.Add('有效期截止日期:' + sfzCard.validterm );
Memo1.Lines.Add('通行证号码:' + sfzCard.passNu);
Memo1.Lines.Add('签发次数:' + sfzCard.signCount );
if (t_nType <> 0) then
begin
Memo1.Lines.Add('照片原始数据:' + leftstr(sfzCard.Photo,50) + '...');
end;
if (t_nType = 2) then
begin
Memo1.Lines.Add('指纹原始数据:' + leftstr(sfzCard.figData,50) + '...');
end;
end
else
begin
Memo1.Lines.Add('读取成功,证件类型:居民身份证');
Memo1.Lines.Add('证件标识:'+ Trim(sfzCard.certType) );
Memo1.Lines.Add('姓 名:'+ sfzCard.name);
Memo1.Lines.Add('性 别:'+ sfzCard.sex);
Memo1.Lines.Add('名 族:'+ sfzCard.people);
Memo1.Lines.Add('出生日期:'+ sfzCard.birthday);
Memo1.Lines.Add('住 址:'+ sfzCard.address);
Memo1.Lines.Add('发证日期:'+ sfzCard.signdate);
Memo1.Lines.Add('有效日期:'+ sfzCard.validterm);
Memo1.Lines.Add('证件号码:'+ sfzCard.number);
Memo1.Lines.Add('发证机关:'+ sfzCard.organs);
Memo1.Lines.Add('其 他:' +sfzCard.Other);
if (t_nType <> 0) then
begin
Memo1.Lines.Add('照片原始数据:' + leftstr(sfzCard.Photo,50) + '...');
end;
if (t_nType = 2) then
begin
Memo1.Lines.Add('指纹原始数据:' + leftstr(sfzCard.figData,50) + '...');
end;
end;
if (t_nType <> 0) then //显示照片文件
begin
jpgtem:=TJPEGImage.Create;
jpgtem.LoadFromFile(t_szPicPath);
Image1.Picture.Assign(jpgtem);
jpgtem.Free;
end;
end
else
begin
Memo1.Lines.Add('身份证读取失败:'+ t_arrChMsg + ',返回值:' +inttostr(t_nRe));
end
end
else
begin
Memo1.Lines.Add('读卡器连接失败,请先打开设备');
end;
end;
读社保卡代码:
procedure TForm1.Button7Click(Sender: TObject);
var
t_nRe:Integer;
t_arrChMsg: PAnsiChar;
SSCard:SSCard_IDINFO;
begin
if IsOpenReader then
begin
t_nRe:= 99;
t_arrChMsg:=AnsiStrAlloc(50);
//结构体SSCard_IDINFO
t_nRe:= Donsee_ReadSSCard(17, @SSCard, t_arrChMsg); //注意结构体入参 Donsee_ReadSSCard
if (t_nRe = 0) then
begin
Memo1.Lines.Add('社保卡读取成功,返回值:' + inttostr(t_nRe));
Memo1.Lines.Add('姓名:' + SSCard.name);
Memo1.Lines.Add('性别:' + SSCard.sex);
Memo1.Lines.Add('民族:' + SSCard.nation);
Memo1.Lines.Add('出生日期:' + SSCard.birthday);
Memo1.Lines.Add('发证日期:' + SSCard.signdate);;
Memo1.Lines.Add('有效日期:' + SSCard.validterm );
Memo1.Lines.Add('卡号:' + SSCard.cardnumber );
Memo1.Lines.Add('身份证号:' + SSCard.idnumber );
Memo1.Lines.Add('城市代码:' + SSCard.city );
Memo1.Lines.Add('社保卡版本:' + SSCard.cardveVrsion );
Memo1.Lines.Add('卡识别码:' + SSCard.identityCode );
Memo1.Lines.Add('其他:' + SSCard.Other );
Donsee_Beep();
end
else
begin
Memo1.Lines.Add('社保卡读取失败:' + t_arrChMsg + ',返回值:' +inttostr(t_nRe));
end
end
else
begin
Memo1.Lines.Add('读卡器连接失败,请先打开设备');
end;
end;