⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testmain.pas

📁 同方PC读卡器驱动
💻 PAS
字号:
unit TestMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,WinSCard,WinsmCrd,SCardErr, ExtCtrls;

type
  TForm1 = class(TForm)
    cb_SelReader: TComboBox;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Image1: TImage;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  hContext:SCARDCONTEXT;
//  hContext:Longint;
  dwReaders:integer;
  mszGroups,mszReaders:LPSTR;
  ret,Count:Longint;
  Busy:Boolean;
 szReader:string;
 dwState,hCard,ReaderLen,atrlen,RecvLen:Longint;
 dwAP,sendlen:DWORD;
 szReaderName:array[0..255]of char;
 dwProtocol:DWORD;
 ATR,SendBuf,RecvBuf:array[0..255]of byte;
 IOSend,IORecv:SCARD_IO_REQUEST;
 ReaderList:TStringList;
 pdwActiveProtocol:DWORD;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Readers:string;
Reader:array[0..255]of char;
len:integer;
begin
    ret:=SCardEstablishContext(SCARD_SCOPE_SYSTEM,nil,nil,@hContext);
    if ret=SCARD_S_SUCCESS then showmessage('PC/SC Manager OK');
    ret:=SCardListReaders(hContext,Nil,Nil,dwReaders);
    setlength(Readers,dwReaders);
    ret:=SCardListReaders(hContext,nil,@Reader,dwReaders);
//也可以这样    ret:=SCardListReadersa(hContext,nil,pchar(Readers),dwReaders);
    if ret<>SCARD_S_SUCCESS then showmessage('Error '+IntToHex(ret,4))
    else
      begin
         len:=0;
         ReaderList:=TStringList.Create;
         strcopy(pchar(readers),reader);
         While Readers[1]<>#0 do
          begin
           CB_SelReader.Items.Add(Readers);
           ReaderList.Add(Readers);
           //strPcopy(reader,Readers+Length(Reader);
           len:=len+strlen(pchar(readers));
           Readers:='';
           SetLength(Readers,255);
           strcopy(pchar(readers),@Reader[len+1]);
           CB_SelReader.ItemIndex:=CB_SelReader.ItemIndex+1;
          end;
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Reader:string;
atrstr:string;
i:integer;
begin
    Reader:=ReaderList.Strings[CB_SelReader.ItemIndex];
    ret:=SCardConnect(hContext,pChar(Reader),SCARD_SHARE_EXCLUSIVE,
             SCARD_PROTOCOL_T0,hCard,@pdwActiveProtocol);
    if ret<>SCARD_S_SUCCESS then showmessage('Error '+IntToHex(ret,4))
    else  showmessage('OK');
    ret:=SCardStatus(hCard,pchar(Reader),ReaderLen,dwState,@dwProtocol,@ATR[0],atrlen);
    if ret<>SCARD_S_SUCCESS then showmessage('Error '+IntToHex(ret,4))
    else
      Begin
       atrstr:='';
       for i:=0 to atrlen-1 do
         atrstr:=atrstr+IntToHex(ATR[i],2);
       showmessage('ATR='+atrstr);
      End;
      IOSend.dwProtocol:=dwProtocol;IORecv.dwProtocol:=dwProtocol;
      IOSend.dbPciLength:=sizeof(IOSend);IORecv.dbPciLength:=sizeof(IOSend);


end;

procedure TForm1.Button2Click(Sender: TObject);
var
comd:array[0..255]of byte;
ComdStr,Msg,Status,retstr:string;
ComdLen,i:integer;
begin
     SendLen:=Length(Edit1.Text) div 2;
     comdstr:='';
     for i:=0 to SendLen-1 do
       SendBuf[i]:=StrToInt('$'+Edit1.Text[2*i+1]+Edit1.Text[2*i+2]);
     RecvLen:=$FF;
//     IOSend.dwProtocol:=SCARD_PROTOCOL_T0;
     ret:=SCardTransmit(hCard,@IOSend,@SendBuf,SendLen,@IORecv,@RecvBuf,@RecvLen);
     if ret<> SCARD_S_SUCCESS then
       showmessage('Error '+IntToHex(ret,4))
     else
       Begin
         retstr:='';
         Status:=IntToHex((RecvBuf[RecvLen-2]*$100+RecvBuf[RecvLen-1]),4);
         for i:=0 to RecvLen-3 do
           retstr:=retstr+IntToHex(RecvBuf[i],2);
         Msg:=Format('Status=%s,return=%s',[Status,retstr]);
         showmessage(msg);
       End;


end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -