1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| DEFINE CLASS SmartCards As Session
#DEFINE SCARD_SCOPE_USER 0
#DEFINE SCARD_SCOPE_SYSTEM 2
#DEFINE SCARD_S_SUCCESS 0
#DEFINE SCARD_E_NO_SERVICE 0x8010001D
hContext=0
ReaderGroups=NULL
Readers=NULL
PROCEDURE Init
THIS.declare
IF NOT THIS.EstablishContext()
= MESSAGEBOX("SCardEstablishContext " +;
"call failed.", 48, "Class Initialization Error")
RETURN .F.
ENDIF
THIS.ReaderGroups = CREATEOBJECT("Collection")
THIS.Readers = CREATEOBJECT("Collection")
THIS.GetReaderGroups
THIS.GetReaders
PROCEDURE Destroy
THIS.ReleaseContext
PROTECTED PROCEDURE EstablishContext
THIS.ReleaseContext
LOCAL nResult, hContext
STORE 0 TO nResult, hContext
nResult = SCardEstablishContext(SCARD_SCOPE_USER,;
0, 0, @hContext)
THIS.hContext = m.hContext
RETURN (nResult=0)
PROTECTED PROCEDURE ReleaseContext
IF THIS.hContext <> 0
= SCardReleaseContext(THIS.hContext)
THIS.hContext=0
ENDIF
PROCEDURE GetReaderGroups
DO WHILE THIS.ReaderGroups.Count > 0
THIS.ReaderGroups.Remove(1)
ENDDO
LOCAL cBuffer, nBufsize, nResult
nBufsize=1024
cBuffer=REPLICATE(CHR(0), nBufsize)
nResult = SCardListReaderGroups(THIS.hContext,;
@cBuffer, @nBufsize)
IF nResult <> SCARD_S_SUCCESS
RETURN .F.
ENDIF
LOCAL nItemCount, nItemIndex, cItem
nItemCount = ALINES(arrSCardItems, cBuffer, CHR(0))
FOR nItemIndex=1 TO nItemCount
cItem = STRTRAN(arrSCardItems[nItemIndex], CHR(0), "")
IF LEN(m.cItem) > 0
THIS.ReaderGroups.Add(m.cItem)
ENDIF
NEXT
PROCEDURE GetReaders()
DO WHILE THIS.Readers.Count > 0
THIS.Readers.Remove(1)
ENDDO
LOCAL cBuffer, nBufsize, nResult
nBufsize=1024
cBuffer=REPLICATE(CHR(0), nBufsize)
nResult = SCardListReaders(THIS.hContext,;
NULL, @cBuffer, @nBufsize)
IF nResult <> SCARD_S_SUCCESS
RETURN .F.
ENDIF
LOCAL nItemCount, nItemIndex, cItem
nItemCount = ALINES(arrSCardItems, cBuffer, CHR(0))
FOR nItemIndex=1 TO nItemCount
cItem = STRTRAN(arrSCardItems[nItemIndex], CHR(0), "")
IF LEN(m.cItem) > 0
THIS.Readers.Add(m.cItem)
ENDIF
NEXT
PROTECTED PROCEDURE declare
DECLARE LONG SCardEstablishContext IN Winscard;
INTEGER dwScope, INTEGER pvReserved1,;
INTEGER pvReserved2, INTEGER @phContext
DECLARE LONG SCardReleaseContext IN Winscard;
INTEGER hContext
DECLARE LONG SCardListReaderGroups IN Winscard;
LONG hContext, STRING @mszGroups,;
LONG @pcchGroups
DECLARE LONG SCardListReaders IN Winscard;
INTEGER hContext, STRING mszGroups,;
STRING @mszReaders, LONG @pcchReaders
DECLARE LONG SCardListCards IN Winscard;
INTEGER hContext, INTEGER pbAtr,;
INTEGER rgguidInterfaces, LONG cguidInterfaceCount,;
STRING @mszCards, LONG @pcchCards
DECLARE LONG SCardListInterfaces IN Winscard;
INTEGER hContext, STRING szCard,;
STRING @pguidInterfaces, LONG @pcguidInterfaces
DECLARE LONG SCardGetProviderId IN Winscard;
INTEGER hContext, STRING szCard,;
STRING @pguidProviderId
DECLARE INTEGER StringFromGUID2 IN ole32;
STRING rguid, STRING @lpsz, INTEGER cchMax
ENDDEFINE |