unit ReadSID;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, jpeg, ComCtrls, Buttons, DB, ADODB, SyncObjs,
Grids, DBGrids;
type
//事件类型
TEvent = (
NoEvent, //没有事件
ReadyReadRec, //准备好读记录
NotFindCard, //没有找到卡
ReadingCardInfo, //正在读卡
ReadCardErr, //读卡错
ErrRec, //错误的记录
ReadRecSuc, //成功读数据
QryMatchRec, //查询到匹配记录
StopRead, //停止读卡
EndEvent //结束程序
);
TfrmReadSID = class(TForm)
qryDB: TADOQuery;
qryDBRec: TIntegerField;
qryDBDSDesigner1: TWideStringField;
qryDBDSDesigner2: TWideStringField;
qryDBDSDesigner3: TWideStringField;
qryDBCSex: TStringField;
qryDBDSDesigner4: TWideStringField;
qryDBDSDesigner5: TWideStringField;
qryDBDSDesigner7: TWideStringField;
DataSource1: TDataSource;
sdOutPut: TSaveDialog;
Label21: TLabel;
Label1: TLabel;
Animate1: TAnimate;
btnRead: TBitBtn;
btnClose: TBitBtn;
GroupBox1: TGroupBox;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
imgPhoto: TImage;
edtSex: TEdit;
edtName: TEdit;
edtBirthDate: TEdit;
edtAddress: TEdit;
edtFolk: TEdit;
edtIDNo: TEdit;
GroupBox2: TGroupBox;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
edtPort: TEdit;
edtEffect: TEdit;
Edit8: TEdit;
StatusBar1: TStatusBar;
procedure btnCloseClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure edtSexKeyPress(Sender: TObject; var Key: Char);
procedure btnReadClick(Sender: TObject);
procedure btnOutputClick(Sender: TObject);
private
{ Private declarations }
cModleSN: Array [0..255]of Char;//安全模块序列号
aName:array [0..29] of Char;
aSex:array [0..1] of Char;
aNation:array [0..3] of Char;
aBir:array [0..15] of Char;
aAddr:array [0..69] of Char;
aPID:array [0..35] of Char;
aPort:array [0..29] of Char;
aEffectS,aEffectE:array [0..15] of Char;
aNewAddr:array [0..256] of Char; AppName: String;
CardPUCIIN: array[0..255] of Byte;
CardPUCSN: array[0..255] of Byte;
CardCHMsgLen: integer;
CardPHMsgLen: integer;
CardNewAddLen: integer;
pucCHMsg: array[0..256] of byte;
pucPHMsg: array[0..1024] of byte;
pucNewAddInfo: array[0..256] of byte;
FOutPutFile: string;
Procedure SetEvent(Event: TEvent);
Procedure Init; public
{ Public declarations }
function ReadCard: integer;
procedure SetErrMsg(ErrMsg: TEvent);
end;var
frmReadSID: TfrmReadSID;
GEvent: TEvent;
CanRead: Boolean;
MatchRecCount: integer;//匹配记录implementationuses CardDll, Global, Main, InputThread;{$R *.dfm}procedure TfrmReadSID.btnCloseClick(Sender: TObject);
begin
SetEvent(EndEvent);
Sleep(100);
Close;
end;procedure TfrmReadSID.FormDestroy(Sender: TObject);
begin
frmReadSID := nil;
end;procedure TfrmReadSID.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;procedure TfrmReadSID.FormCreate(Sender: TObject);
begin
Init;
AppName:= GetDirPath;
end;procedure TfrmReadSID.edtSexKeyPress(Sender: TObject; var Key: Char);
begin
Key := #0;
end;function TfrmReadSID.ReadCard: integer;
var
iFileHandle: Integer; i,j,num:integer;
a,b:string;
//Ch:Char;
tmpPID:string;
hnddll:Thandle;
PathString:string;
StrL:integer;
iResultValue: integer;
sTrimName: String;
begin
Result := -1;
Animate1.Active := False;
//SDT_ClosePort(CurReaderComPort);
//Label21.Font.Color := clBlue;
//label21.Cursor := crDefault;
//开始找卡:
//SetCursor(Self, crHourGlass); iResultValue := SDT_StartFindIDCard(CurReaderComPort, @CardPUCIIN, IFOpen);
If iResultValue <> $9f Then //找卡不成功,可能是没有卡或者卡片一直处于磁场中
begin
//SDT_ClosePort(CurReaderComPort);
//SDT_OpenPort(CurReaderComPort);
Sleep(G_Time);
//exit;
end;
//else if iResultValue = $9f Then
begin
Animate1.Active := True;
MatchRecCount := 0;
ClearAll(Self);
imgPhoto.Visible := False;
imgPhoto.Refresh;
imgPhoto.Visible := False;
Label21.Caption := '';
Label21.Font.Color := clBlue;
//label21.Refresh;
iResultValue := SDT_SelectIDCard(CurReaderComPort, @CardPUCSN, IFOpen);
//读卡片中的标识
//If iResultValue = 144 Then
begin
//开始读卡内人员信息
Label21.Font.Color := clBlue;
Label21.Caption:= '正在读卡......';
Label21.Refresh;
//SetEvent(ReadingCardInfo);
//Sleep(10);
//label21.Refresh;
//将卡片中的人员基本信息和照片存入文件中
iResultValue := SDT_ReadBaseMsg(CurReaderComPort, @pucchmsg, @CardCHMsgLen, @pucphmsg, @CardPHMsgLen, IFOpen);
if iResultValue <> 144 Then
begin
Label21.Font.Color := clRed;
Label21.Caption:= '读卡失败,请再次放卡重试';
//SetEvent(ReadCardErr);
//Sleep(10);
//label21.Refresh;
exit;
end
procedure TfrmReadSID.Init;
begin
SetEvent(NoEvent);
CS := TCriticalSection.Create;
TComRead.Create(False); //创建读卡监视线程
//ReadCard;
//TGetErrMessage.Create(False); //创建错误消息监视线程
end;procedure TfrmReadSID.btnReadClick(Sender: TObject);
Var sModleSN: String;
iResultValue: integer;
iState: integer;begin Label21.Caption := '';
Label21.Font.Color := clBlue;
Label21.Refresh;
if btnRead.Caption = '停止' then
begin
btnRead.Caption := '开始';
SetEvent(StopRead);
end
else
if btnRead.Caption = '开始' then
begin
{iResultValue := SDT_ResetSam(CurReaderComPort, IFOpen);
if iResultValue = 144 Then
begin end
else
begin
Error('安全模块复位失败, ' + ErrorType(iResultValue));
exit;
end;
Sleep(2000);
iResultValue := SDT_SetMaxRFByte(CurReaderComPort, 255, IFOpen);
if iResultValue = 144 Then
begin
//StatusBar1.Panels[1].Text := '安全模块状态: 正常';
end
else
begin
Label21.Font.Color := clRed;
Label21.Caption := '设置通讯字节数失败, ' + ErrorType(iResultValue);
exit;
end;}
iResultValue := SDT_GetSAMStatus(CurReaderComPort, IFOpen);
if iResultValue = 144 Then
begin
StatusBar1.Panels[1].Text := '安全模块状态: 正常';
end
else
begin
StatusBar1.Panels[1].Text := '安全模块状态: 失败';
exit;
end;
//getmem(cModleSN, 255); }
iResultValue := SDT_GetSAMIDToStr(CurReaderComPort, cModleSN, IFOpen);
//sModleSN := String(cModleSN);
if iResultValue = 144 Then
begin
sModleSN := String(cModleSN);
//freemem(cModleSN);
StatusBar1.Panels[0].Text := '安全模块序列号:' + sModleSN;
end
else
begin
StatusBar1.Panels[0].Text := '安全模块序列号: 无效';
end; {} btnRead.Caption := '停止';
StatusBar1.Refresh;
Label21.Refresh;
//ReadCard;
SetEvent(ReadyReadRec);
end;
Result := -1;
Animate1.Active := False;
//SDT_ClosePort(CurReaderComPort);
//Label21.Font.Color := clBlue;
//label21.Cursor := crDefault;
//开始找卡:
//SetCursor(Self, crHourGlass); iResultValue := SDT_StartFindIDCard(CurReaderComPort, @CardPUCIIN, IFOpen);
If iResultValue <> $9f Then //找卡不成功,可能是没有卡或者卡片一直处于磁场中
begin
//SDT_ClosePort(CurReaderComPort);
//SDT_OpenPort(CurReaderComPort);
Sleep(G_Time);
//exit;
end;
//else if iResultValue = $9f Then
begin
Animate1.Active := True;
MatchRecCount := 0;
ClearAll(Self);
imgPhoto.Visible := False;
imgPhoto.Refresh;
imgPhoto.Visible := False;
Label21.Caption := '';
Label21.Font.Color := clBlue;
//label21.Refresh;
iResultValue := SDT_SelectIDCard(CurReaderComPort, @CardPUCSN, IFOpen);
循环读取的关键应该就是这段代码了吧...看不懂...哪位大大愿意出手
我的目的就是想让vc也能象delphi那样循环读取信息(拣主要的翻译就可以了)3Q
Result = -1;
Animate1.Active = False;
//SDT_ClosePort(CurReaderComPort);
//Label21.Font.Color := clBlue;
//label21.Cursor := crDefault;
//开始找卡:
//SetCursor(Self, crHourGlass); iResultValue = SDT_StartFindIDCard(CurReaderComPort, &CardPUCIIN, IFOpen);
if (iResultValue != $9f) //找卡不成功,可能是没有卡或者卡片一直处于磁场中
{
//SDT_ClosePort(CurReaderComPort);
//SDT_OpenPort(CurReaderComPort);
Sleep(G_Time);
//exit;
}
//else if iResultValue = $9f Then
{
Animate1.Active = True;
MatchRecCount = 0;
ClearAll(Self);
imgPhoto.Visible = False;
imgPhoto.Refresh;
imgPhoto.Visible = False;
Label21.Caption[0] = 0;
Label21.Font.Color = clBlue;
//label21.Refresh;
iResultValue = SDT_SelectIDCard(CurReaderComPort, &CardPUCSN, IFOpen);
这里的翻译不难,关键是vc还有imgPhoto、Label21这样的对象可以使用吗?c++builder还差不多
Animate1->Active = False;if (iResultValue != 0x9f) //找卡不成功,可能是没有卡或者卡片一直处于磁场中