Sample code for 30+ languages & platforms
DataFlex

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 DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoScard
    Variant vStReaders
    Handle hoStReaders
    Integer iNumReaders
    Integer i
    String sReader
    String sTemp1
    Boolean bTemp1

    Move False To iSuccess

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

    Get Create (RefClass(cComChilkatSCard)) To hoScard
    If (Not(IsComObjectCreated(hoScard))) Begin
        Send CreateComObject of hoScard
    End

    // First establish a context to the PC/SC Resource Manager
    Get ComEstablishContext Of hoScard "user" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoScard To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatStringTable)) To hoStReaders
    If (Not(IsComObjectCreated(hoStReaders))) Begin
        Send CreateComObject of hoStReaders
    End
    Get pvComObject of hoStReaders to vStReaders
    Get ComListReaders Of hoScard vStReaders To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoScard To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComCount Of hoStReaders To iNumReaders
    Move 0 To i
    While (i < iNumReaders)
        Get ComStringAt Of hoStReaders i To sReader

        Showln i ": " sReader

        // Connect to this reader.
        Get ComConnect Of hoScard sReader "shared" "no_preference" To bTemp1
        If (bTemp1 = True) Begin

            // Check the status to get the reader state, active protocol, and card ATR (if a card is inserted).
            Get ComCheckStatus Of hoScard To bTemp1
            If (bTemp1 = True) Begin
                Get ComReaderStatus Of hoScard To sTemp1
                Showln "ReaderStatus: " sTemp1
                Get ComCardAtr Of hoScard To sTemp1
                Showln "CardAtr: " sTemp1
                Get ComActiveProtocol Of hoScard To sTemp1
                Showln "ActiveProtocol: " sTemp1
            End
            Else Begin
                Get ComLastErrorText Of hoScard To sTemp1
                Showln sTemp1
                Showln "CheckStatus failed."
            End

            // Disconnect from this reader.
            Get ComDisconnect Of hoScard "leave" To iSuccess
        End
        Else Begin
            Get ComLastErrorText Of hoScard To sTemp1
            Showln sTemp1
            Showln "Connect failed."
        End

        Showln "---------------------------------------"
        Move (i + 1) To i
    Loop

    // 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.
    Get ComReleaseContext Of hoScard To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoScard To sTemp1
        Showln sTemp1
    End



End_Procedure