Lista dei lettori di SmartCard

  1. 2 weeks ago

    Salve dopo un anno mi ritrovo con un piccolo problema, un pezzo del mio software legge da un lettore di smartcard i dati di una cns e finqui tutto bene il problema è sorto quando sul computer dove sono andato ad installare il software ci sono due lettori attaccati, tramite la chiamata alla DLL pensavo che avrei visto l'elenco dei lettori connessi e quindi avrei potuto scegliere quale usare invece mi da sempre e solo un lettore metre se provo con un tool che ho in elenco ci sono tutti e due i lettori, di seguito riporto la chiamato alla DLL

    Declare Function SCardListReaders Lib "WinScard.dll" Alias "SCardListReadersA" ( _
    ByVal hContext As Integer, _
    ByVal mzGroup As Cstring, _
    ByVal ReaderList As Cstring, _
    ByRef pcchReaders As Uint32 _
    ) As Integer

    Dim mzGroup As String
    Dim Nullo As Cstring = Nil

    //
    // Mi ritorna la lunghezza del buffer da predisporre in readerlen
    //
    retval = SCardListReaders(hContext, mzGroup, Nullo, readerlen)

    Dim r As New MemoryBlock(readerlen)
    Dim ReaderList As Cstring = r

    //
    // Mi ritorna in ReaderList l'elenco dei lettori Multistringa Nomi separati da Null
    //
    retval = SCardListReaders(hContext, mzGroup, ReaderList, readerlen)

    Con questa chiamata mi dovrebbe restituire i lettori connessi ma mentre la lunghezza del buffer è giusta, nel mio caso 57 byte, nella string ReaderList mi ritrovo solo il primo lettore seguito da tutti Null.
    Se avete qualche suggerimento ve ne sarei grato.

  2. Christian S

    Feb 11 Pre-Release Testers, Xojo Pro, XDC Speakers Germany

    Hai provato la classe SmartCardMBS in MBS Xojo Plugins ?

    Did you try SmartCardMBS class in MBS Xojo Plugins ?

  3. Edited 2 weeks ago

    Non posso utilizzare plugin di terze parti, mi spiace

  4. Maurizio R

    Feb 11 Pre-Release Testers, Xojo Pro
    Edited 2 weeks ago

    Dalla documentazione SCardListReadersA function

    retval = SCardListReaders(Nil, Nil, Nil, readerlen)

    fornisce risultati diversi?

    P.S.
    Nella 2a chiamata di funzione usa r al posto di ReaderList

    retval = SCardListReaders(hContext, mzGroup, r, readerlen)

    modificando la dichiarazione in

    Declare Function SCardListReaders Lib "WinScard.dll" Alias "SCardListReadersA" ( _
    ByVal hContext As Integer, _
    ByVal mzGroup As Cstring, _
    ReaderList As Ptr, _
    ByRef pcchReaders As Uint32 _
    ) As Integer
  5. last week
    Edited last week

    Ciao grazie per la risposta la prima chiamata non può avere il primo parametro Null perché deve essere quello che ti viene restituito da una chiamata precedente che si chiama SCardConnect comunque la prima chiamata volendo là si può anche evitare perché serve solo per avere la lunghezza dei dati da leggere se tu prevedi un buffer di ricezione abbastanza grande es. 256 byte non hai la necessità di farla ma puoi passare direttamente alla seconda chiamata, ho provato a modificare la chiamata sia come ReaderList As Ptr sia come ByRef in tutti e due i casi il programma si chiude senza nessuna spiegazione ne errore, comunque grazie per la risposta

  6. Scusa prima ho sbagliato la chiamata che precede è SCardEstablishContext e non SCardConnect quella e subito successiva e la si fa in base al lettore scelto

  7. Maurizio R

    Feb 12 Pre-Release Testers, Xojo Pro

    Il programma che si chiude e' l'indicazione di qualche problema nei parametri se questo si presenta alla chiamata di SCardListReadersA.
    La documentazione riporta che il primo parametro puo' anche essere NULL.

    Personalmente utilizzo sempre Ptr e Memoryblock al posto di CString: e' piu' chiaro dove i dati transitano ed e' migliore l'ispezione del contenuto delle aree di scambio.
    Vista la scarsita' degli strumenti di debug e' necessario prestare particolare attenzione alla chiamata di funzioni nelle DLL.

    Continua con il debug ed eventualmente riporta ulteriori informazioni.

    Saluti.

  8. Ciao mettendo 0 (zero) al primo parametro mi ritorna la lunghezza di lettura (pcchReaders) con valore 1, cioè senza senso se invece metti il valore di hContext che hai ricevuto dalla precedente chiamata ti ritorna 57 che è la lunghezza giusta del buffer.
    La chiamata precedente è

    retval = SCardEstablishContext(&h0, &h0, &h0, hContext)

    in uscita hContext assume un valore, retval se è 0 tutto ok altrimenti errore di chiamata.

    Ora prova a scrivere un programmino in c# chiamandolo da XoJo come COM Interop e vedo cosa mi ritorna.

  9. Maurizio R

    Feb 13 Pre-Release Testers, Xojo Pro

    Perfetto, vedo che puoi usare anche altri strumenti.

or Sign Up to reply!