Salvo ho la necessit di leggere i dati dalle tessere CNS, da un programma in VB6 ho ricavato le funzioni per le chiamate a WinScard.dll il problema che non riesco a tradurre esattamente come passare i parametri alle chiamate.
Ho riportato solo due chiamate perch le altre sono con la stessa impostazione.
Il sorgente VB6
Public Declare Function SCardEstablishContext Lib “WinScard.dll” ( _
ByVal dwScope As Long, _
ByVal pvReserved1 As Long, _
ByVal pvReserved2 As Long, _
ByRef phContext As Long _
) As Long
Public Declare Function SCardListReaders Lib “WinScard.dll” Alias “SCardListReadersA” ( _
ByVal hContext As Long, _
ByVal mzGroup As String, _
ByVal ReaderList As String, _
ByRef pcchReaders As Long _
) As Long
che ho tradotto in Xojo cos
Declare Function SCardEstablishContext Lib “WinScard.dll” ( _
ByVal dwScope As Integer, _
ByVal pvReserved1 As Integer, _
ByVal pvReserved2 As Integer, _
ByRef phContext As Integer _
) As Integer
Declare Function SCardListReaders Lib “WinScard.dll” Alias “SCardListReadersA” ( _
ByVal hContext As Integer, _
ByVal mzGroup As CString, _
ByVal ReaderList As Cstring, _
ByRef pcchReaders As Integer _
) As Integer
la chiamata in VB6
Dim mszGroups As String
Dim szReaderLists As String * 256
lResult = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, hContext) ’ SCARD_SCOPE_USER = 0
If lResult <> SCARD_S_SUCCESS Then ’ SCARD_S_SUCCESS deve essere 0
MsgBox “Cannot establish connection”
MsgBox "ReturnCode(ESTACON): " + Hex(lResult)
End If
nReaderCount = 255
lResult = SCardListReaders(hContext, mszGroups, szReaderLists, nReaderCount)
Dim sTemp As String
Dim Index As Integer
Index = 1
sTemp = “”
Ctrl.Clear
While (Mid(ReaderList, Index, 1) <> vbNullChar)
While (Mid(ReaderList, Index, 1) <> vbNullChar)
sTemp = sTemp + Mid(ReaderList, Index, 1)
Index = Index + 1
Wend
Index = Index + 1
Ctrl.AddItem sTemp
sTemp = “”
Wend ’ in sTemp ho il nome del lettore di Card che poi serve nelle altre chiamate
che ho tradotto in Xojo cos:
retval = SCardEstablishContext(SCARD_SCOPE_USER, &h0, &h0, hContext)
If (retval <> 0) Then
MsgBox ("Errore: " + Str(retval))
return
end if
Dim mzGroup As String = “”
Dim r As New MemoryBlock(256)
Dim reder As String
Dim sTemp As String
Dim Indice As Integer
reder = r
readerlen = 255
’ FACCIO UNA LISTA DEI LETTORI DISPONIBILI
retval = SCardListReaders(hContext, mzGroup, reder, readerlen)
If (retval <> 0) Then
MsgBox(“Errore " + hex(retval) + " Lettore non trovato!”)
return
end if
Indice = 1
sTemp =""
While mid(reder, Indice, 1) <> Str(&h0)
While mid(reder, Indice, 1) <> Str(&h0)
sTemp = sTemp +mid(reder, Indice, 1)
MsgBox(" indice " + Str(Indice) + " Carattere " + hex(val(mid(reder, indice, 1))))
Indice = Indice + 1
Wend
Indice = Indice + 1
sTemp = “”
Wend
la prima chiamata SCardEstablishContext funziona perfettamente verificato con il run del programma in VB6 i valori ritornati sono gli stessi
la seconda chiamata SCardListReaders mentre in VB6 ritorna la lista dei lettori collegati in Xojo ritorna sempre una stringa Null.
Tutte le altre chiamate per leggere scrivere le Smart Card sono impostate come SCardListReaders quindi risolta una avrei risolto tutto.
Qualcuno pu aiutarmi perch sono completamente a corto di idee, grazie