Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

PC/SC Check the Status of each Smart Card Reader (and USB token)

See more SCard Examples

Demonstrates how to list the smart card readers and USB tokens connected to the computer, and check the status of each.

Note: This functionality was introduced in Chilkat v9.5.0.87.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.StringTable,
  Chilkat.SCard;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  scard: TSCard;
  stReaders: TStringTable;
  numReaders: Integer;
  i: Integer;
  reader: string;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  scard := TSCard.Create;

  //  First establish a context to the PC/SC Resource Manager
  success := scard.EstablishContext('user');
  if (success = False) then
    begin
      WriteLn(scard.LastErrorText);
      Exit;
    end;

  stReaders := TStringTable.Create;
  success := scard.ListReaders(stReaders);
  if (success = False) then
    begin
      WriteLn(scard.LastErrorText);
      Exit;
    end;

  numReaders := stReaders.Count;
  i := 0;
  while i < numReaders do
    begin
      reader := stReaders.StringAt(i);

      WriteLn(i + ': ' + reader);

      //  Connect to this reader.
      if (scard.Connect(reader,'shared','no_preference') = True) then
        begin

          //  Check the status to get the reader state, active protocol, and card ATR (if a card is inserted).
          if (scard.CheckStatus() = True) then
            begin
              WriteLn('ReaderStatus: ' + scard.ReaderStatus);
              WriteLn('CardAtr: ' + scard.CardAtr);
              WriteLn('ActiveProtocol: ' + scard.ActiveProtocol);
            end
          else
            begin
              WriteLn(scard.LastErrorText);
              WriteLn('CheckStatus failed.');
            end;

          //  Disconnect from this reader.
          success := scard.Disconnect('leave');
        end
      else
        begin
          WriteLn(scard.LastErrorText);
          WriteLn('Connect failed.');
        end;
      WriteLn('---------------------------------------');
      i := i + 1;
    end;

  //  Sample output:

  //  0: Alcor Micro USB Smart Card Reader 0
  //  ReaderStatus: specific
  //  CardAtr: 3B7F96000080318065B0855956FB120FFE829000
  //  ActiveProtocol: T0
  //  ---------------------------------------
  //  1: Generic Smart Card Reader Interface 0
  //  ReaderStatus: specific
  //  CardAtr: 3BFC180000813180459067464A00641606F2727E00E0
  //  ActiveProtocol: T1
  //  ---------------------------------------
  //  2: SCM Microsystems Inc. SCR33x USB Smart Card Reader 0
  //  ReaderStatus: specific
  //  CardAtr: 3BDF96FF8131FE455A018048494443313158587300011B09
  //  ActiveProtocol: T1
  //  ---------------------------------------

  //  Applications should always release the context when finished.
  success := scard.ReleaseContext();
  if (success = False) then
    begin
      WriteLn(scard.LastErrorText);
    end;


  scard.Free;
  stReaders.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.