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
(SQL Server) 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.
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls. -- CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int DECLARE @iTmp0 int -- Important: Do not use nvarchar(max). See the warning about using nvarchar(max). DECLARE @sTmp0 nvarchar(4000) -- This example requires the Chilkat API to have been previously unlocked. -- See Global Unlock Sample for sample code. DECLARE @scard int -- Use "Chilkat_9_5_0.SCard" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.SCard', @scard OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END -- First establish a context to the PC/SC Resource Manager DECLARE @success int EXEC sp_OAMethod @scard, 'EstablishContext', @success OUT, 'user' IF @success = 0 BEGIN EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @scard RETURN END -- 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. DECLARE @json int -- Use "Chilkat_9_5_0.JsonObject" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT EXEC sp_OAMethod @scard, 'FindSmartcards', @success OUT, @json IF @success = 0 BEGIN EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @scard EXEC @hr = sp_OADestroy @json RETURN END -- 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" -- } -- ] -- } EXEC sp_OASetProperty @json, 'EmitCompact', 0 EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT PRINT @sTmp0 PRINT ' ' -- We can iterate over the JSON to find the readers with a smart card already inserted.. DECLARE @name nvarchar(4000) DECLARE @sbState int -- Use "Chilkat_9_5_0.StringBuilder" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbState OUT DECLARE @i int SELECT @i = 0 DECLARE @count_i int EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'reader' WHILE @i < @count_i BEGIN EXEC sp_OASetProperty @json, 'I', @i EXEC sp_OAMethod @json, 'StringOf', @name OUT, 'reader[i].name' EXEC sp_OAMethod @sbState, 'Clear', NULL EXEC sp_OAMethod @json, 'StringOfSb', @success OUT, 'reader[i].state', @sbState EXEC sp_OAMethod @sbState, 'Contains', @iTmp0 OUT, 'present', 1 IF @iTmp0 = 1 BEGIN PRINT @name + ' has a smart card inserted.' END ELSE BEGIN PRINT @name + ' does not have a smart card inserted.' END SELECT @i = @i + 1 END PRINT ' ' -- 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. DECLARE @stReaders int -- Use "Chilkat_9_5_0.StringTable" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.StringTable', @stReaders OUT EXEC sp_OAMethod @scard, 'ListReaders', @success OUT, @stReaders IF @success = 0 BEGIN EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @scard EXEC @hr = sp_OADestroy @json EXEC @hr = sp_OADestroy @sbState EXEC @hr = sp_OADestroy @stReaders RETURN END -- Show the reader names.. DECLARE @numReaders int EXEC sp_OAGetProperty @stReaders, 'Count', @numReaders OUT SELECT @i = 0 WHILE @i < @numReaders BEGIN EXEC sp_OAMethod @stReaders, 'StringAt', @sTmp0 OUT, @i PRINT @i + ': ' + @sTmp0 SELECT @i = @i + 1 END -- 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. DECLARE @json2 int -- Use "Chilkat_9_5_0.JsonObject" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json2 OUT EXEC sp_OAMethod @scard, 'GetStatusChange', @success OUT, 30000, @stReaders, @json2 IF @success = 0 BEGIN EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @scard EXEC @hr = sp_OADestroy @json EXEC @hr = sp_OADestroy @sbState EXEC @hr = sp_OADestroy @stReaders EXEC @hr = sp_OADestroy @json2 RETURN END PRINT ' ' -- Let's see what happened... EXEC sp_OASetProperty @json2, 'EmitCompact', 0 EXEC sp_OAMethod @json2, 'Emit', @sTmp0 OUT PRINT @sTmp0 PRINT ' ' -- 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... DECLARE @changed int DECLARE @state nvarchar(4000) DECLARE @atr nvarchar(4000) DECLARE @numChanged int EXEC sp_OAMethod @json2, 'IntOf', @numChanged OUT, 'numChanged' PRINT 'number of readers with a changed state: ' + @numChanged SELECT @i = 0 EXEC sp_OAMethod @json2, 'SizeOfArray', @count_i OUT, 'reader' WHILE @i < @count_i BEGIN EXEC sp_OASetProperty @json2, 'I', @i EXEC sp_OAMethod @json2, 'BoolOf', @changed OUT, 'reader[i].changed' IF @changed = 1 BEGIN EXEC sp_OAMethod @json2, 'StringOf', @name OUT, 'reader[i].name' EXEC sp_OAMethod @json2, 'StringOf', @state OUT, 'reader[i].state' PRINT 'Changed: ' PRINT ' reader name: ' + @name PRINT ' new state: ' + @state -- If a card is now in this reader, we should have the ATR of the card.. EXEC sp_OAMethod @json2, 'HasMember', @iTmp0 OUT, 'reader[i].atr' IF @iTmp0 = 1 BEGIN EXEC sp_OAMethod @json2, 'StringOf', @atr OUT, 'reader[i].atr' PRINT ' ATR of card inserted into this reader: ' + @atr END END SELECT @i = @i + 1 END -- 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. EXEC sp_OAMethod @scard, 'ReleaseContext', @success OUT IF @success = 0 BEGIN EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 END EXEC @hr = sp_OADestroy @scard EXEC @hr = sp_OADestroy @json EXEC @hr = sp_OADestroy @sbState EXEC @hr = sp_OADestroy @stReaders EXEC @hr = sp_OADestroy @json2 END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.