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;

解决方案 »

  1.   

    发出去之后才知道原来这么长.....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);
    循环读取的关键应该就是这段代码了吧...看不懂...哪位大大愿意出手
    我的目的就是想让vc也能象delphi那样循环读取信息(拣主要的翻译就可以了)3Q
      

  2.   

    对C不熟悉。这里关键就是CardPUCSN这个回调函数。
      

  3.   

    pascal与c几乎是一一对应的,特别要注意的是带var的参数对于c其实是指针,相当于c++的&(参考模式)
      

  4.   

    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)  //找卡不成功,可能是没有卡或者卡片一直处于磁场中
      {
        
        //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还差不多
      

  5.   

    2类地方要改进一下:
    Animate1->Active = False;if (iResultValue != 0x9f)  //找卡不成功,可能是没有卡或者卡片一直处于磁场中