Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Visual FoxPro) PC/SC Wait for Smart Card Status Change (Inserted, Removed from Reader, etc.)See more SCard ExamplesDemonstrates how to synchronously wait for a status change, such as for a smart card to be inserted into a reader, or removed from a reader. Note: This functionality was introduced in Chilkat v9.5.0.87.
LOCAL loScard LOCAL lnSuccess LOCAL loJson LOCAL lcName LOCAL loSbState LOCAL i LOCAL lnCount_i LOCAL loStReaders LOCAL lnNumReaders LOCAL loJson2 LOCAL lnChanged LOCAL lcState LOCAL lcAtr LOCAL lnNumChanged * This example requires the Chilkat API to have been previously unlocked. * See Global Unlock Sample for sample code. * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.SCard') loScard = CreateObject('Chilkat.SCard') * First establish a context to the PC/SC Resource Manager lnSuccess = loScard.EstablishContext("user") IF (lnSuccess = 0) THEN ? loScard.LastErrorText RELEASE loScard CANCEL ENDIF * First we'll examine the state of all connected readers to see which have smartcards already inserted.. * Get JSON containing information about the smartcards currently inserted into readers. * This also includes information about USB security tokens. * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.JsonObject') loJson = CreateObject('Chilkat.JsonObject') lnSuccess = loScard.FindSmartcards(loJson) IF (lnSuccess = 0) THEN ? loScard.LastErrorText RELEASE loScard RELEASE loJson CANCEL ENDIF * When writing this example, I have 3 smart card readers plugged into my system. * One of them has a smart card inserted. * Here's the JSON returned by FindSmartcards... * { * "reader": [ * { * "name": "Alcor Micro USB Smart Card Reader 0", * "state": "empty" * }, * { * "name": "Generic Smart Card Reader Interface 0", * "state": "present", * "vendorName": "Generic", * "serialNumber": "3230303730383138303030303030303030", * "systemName": "Generic Smart Card Reader Interface 0", * "card": { * "atr": "3BFC180000813180459067464A00641606F2727E00E0", * "windows": { * "miniDriver": "tagliov70px.dll", * "cryptoProvider": "Microsoft Base Smart Card Crypto Provider", * "keyStorageProvider": "Microsoft Smart Card Key Storage Provider" * } * } * }, * { * "name": "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0", * "state": "empty" * } * ] * } loJson.EmitCompact = 0 ? loJson.Emit() ? " " * We can iterate over the JSON to find the readers with a smart card already inserted.. * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.StringBuilder') loSbState = CreateObject('Chilkat.StringBuilder') i = 0 lnCount_i = loJson.SizeOfArray("reader") DO WHILE i < lnCount_i loJson.I = i lcName = loJson.StringOf("reader[i].name") loSbState.Clear() loJson.StringOfSb("reader[i].state",loSbState) IF (loSbState.Contains("present",1) = 1) THEN ? lcName + " has a smart card inserted." ELSE ? lcName + " does not have a smart card inserted." ENDIF i = i + 1 ENDDO ? " " * Now let's begin the code to wait for a change (where a smart card gets inserted or removed) * Get the list of all readers. * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.StringTable') loStReaders = CreateObject('Chilkat.StringTable') lnSuccess = loScard.ListReaders(loStReaders) IF (lnSuccess = 0) THEN ? loScard.LastErrorText RELEASE loScard RELEASE loJson RELEASE loSbState RELEASE loStReaders CANCEL ENDIF * Show the reader names.. lnNumReaders = loStReaders.Count i = 0 DO WHILE i < lnNumReaders ? STR(i) + ": " + loStReaders.StringAt(i) i = i + 1 ENDDO * Sample output from the above loop. * 0: Alcor Micro USB Smart Card Reader 0 * 1: Generic Smart Card Reader Interface 0 * 2: SCM Microsystems Inc. SCR33x USB Smart Card Reader 0 * * Synchronously wait 30 seconds for a card to be inserted or removed from any of the above readers. * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.JsonObject') loJson2 = CreateObject('Chilkat.JsonObject') lnSuccess = loScard.GetStatusChange(30000,loStReaders,loJson2) IF (lnSuccess = 0) THEN ? loScard.LastErrorText RELEASE loScard RELEASE loJson RELEASE loSbState RELEASE loStReaders RELEASE loJson2 CANCEL ENDIF ? " " * Let's see what happened... loJson2.EmitCompact = 0 ? loJson2.Emit() ? " " * This is what json2 contains. * A card was inserted into the reader named "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0" * The "numChanged" indicates that one reader's status changed. * The "changed":true indicates the reader that changed. The state is now "present". * { * "numChanged": 1, * "reader": [ * { * "name": "Alcor Micro USB Smart Card Reader 0", * "changed": false, * "state": "empty" * }, * { * "name": "Generic Smart Card Reader Interface 0", * "changed": false, * "state": "present", * "atr": "3BFC180000813180459067464A00641606F2727E00E0" * }, * { * "name": "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0", * "changed": true, * "state": "present", * "atr": "3BDF96FF8131FE455A018048494443313158587300011B09" * } * ] * } * Find the reader that changed... lnNumChanged = loJson2.IntOf("numChanged") ? "number of readers with a changed state: " + STR(lnNumChanged) i = 0 lnCount_i = loJson2.SizeOfArray("reader") DO WHILE i < lnCount_i loJson2.I = i lnChanged = loJson2.BoolOf("reader[i].changed") IF (lnChanged = 1) THEN lcName = loJson2.StringOf("reader[i].name") lcState = loJson2.StringOf("reader[i].state") ? "Changed: " ? " reader name: " + lcName ? " new state: " + lcState * If a card is now in this reader, we should have the ATR of the card.. IF (loJson2.HasMember("reader[i].atr") = 1) THEN lcAtr = loJson2.StringOf("reader[i].atr") ? " ATR of card inserted into this reader: " + lcAtr ENDIF ENDIF i = i + 1 ENDDO * The output from the above loop: * number of readers with a changed state: 1 * Changed: * reader name: SCM Microsystems Inc. SCR33x USB Smart Card Reader 0 * new state: present * ATR of card inserted into this reader: 3BDF96FF8131FE455A018048494443313158587300011B09 * Applications should always release the context when finished. lnSuccess = loScard.ReleaseContext() IF (lnSuccess = 0) THEN ? loScard.LastErrorText ENDIF RELEASE loScard RELEASE loJson RELEASE loSbState RELEASE loStReaders RELEASE loJson2 |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.