PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → lister le nom des lecteurs PC/SC branchés
lister le nom des lecteurs PC/SC branchés
Iniciado por webmaster, 02,dic. 2019 18:41 - 10 respuestas
Publicado el 02,diciembre 2019 - 18:41
Bonjour,

J'essaye de lister le nom des lecteurs PC/SC branchés sur mon PC (il y en a 2 qui sont bien reconnu)
J'ai testé le code suivant, il fonctionne mais il ne retourne qu'un seul de mes 2 lecteurs
Avez-vous une idée du problème ? merci

int_gestionnaireDll est un entier sur 4 octets
int_gestionnaireContexte est un entier sur 4 octets

int_resultatSCardEstablishContext est un entier sur 4 octets
int_resultatSCardListReaders est un entier sur 4 octets

str_listeLecteur est une chaîne ASCIIZ sur 255
int_longueurListeLecteur est un entier sur 4 octets = 255

struct_ScardIoRequest est une Structure
int_protocolCommunication est un entier sur 4 octets
int_longueurStructure est un entier sur 4 octets
FIN

int_gestionnaireDll = ChargeDLL("winscard.dll")

SI int_gestionnaireDll = 0 ALORS
Erreur(ErreurInfo())
SINON
Info("DLL chargée")
FIN


int_resultatSCardEstablishContext = API("Winscard.dll","SCardEstablishContext",0,Null,Null,&int_gestionnaireContexte)
IF int_resultatSCardEstablishContext = 0 ALORS
Info("OK")
ELSE
Info("Erreur")
END


int_resultatSCardListReaders = API ("Winscard.dll","SCardListReadersA",int_gestionnaireContexte,Null,&str_listeLecteur,&int_longueurListeLecteur)

Info(str_listeLecteur) // N'affiche qu'un seul nom de lecteur
Miembro registrado
948 mensajes
Publicado el 03,diciembre 2019 - 09:50
Bonjour
normal car suivant la doc str_listeLecteur est composée de "nom_1 0x00 nom_2 0x00 0x00"
case SCARD_S_SUCCESS:
// Do something with the multi string of readers.
// Output the values.
// A double-null terminates the list of values.
pReader = pmszReaders;
while ( '\0' != *pReader )
{
// Display the value.
printf("Reader: %S\n", pReader );
// Advance to the next value.
pReader = pReader + wcslen((wchar_t *)pReader) + 1;
}

--
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai.
Quand un utilisateur vous a aidé, n'oubliez pas de le remercier...
Publicado el 04,diciembre 2019 - 09:21
>>normal car suivant la doc str_listeLecteur est composée de "nom_1 0x00 nom_2 0x00 0x00"
case SCARD_S_SUCCESS:

Oui, j'ai bien vu ça
Mais comment récupérer cette liste alors en Windev, car actuellement ma chaine ne contient que le premier nom et rien d'autre
Miembro registrado
948 mensajes
Publicado el 04,diciembre 2019 - 14:37
Bonjour
ce bout de code devrait vous aider
str_listeLecteur est une chaîne = "lecteur1"+Caract(0x00)+"lecteur2"+Caract(0x00)+Caract(0x00)

stringPtr est un entier système = &str_listeLecteur
Lecteur est une chaîne = ""
nOctet est un entier sans signe sur 1 octet
LOOP
Transfer(&nOctet, stringPtr, 1)
IF nOctet = 0x00 THEN
IF Lecteur = "" THEN
SORTIR
ELSE
Trace(Lecteur)
Lecteur = ""
stringPtr++
END
ELSE
Lecteur += Caract(nOctet)
stringPtr++
END
END



"car actuellement ma chaine ne contient que le premier nom et rien d'autre" si elle contient des caractères 0x00 qui pour windev (et le C) signifie «fin de chaine» donc quand vous faites Info() vous ne voyez que la première chaine
--
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai.
Quand un utilisateur vous a aidé, n'oubliez pas de le remercier...
Mensaje modificado, 04,diciembre 2019 - 14:42
Publicado el 04,diciembre 2019 - 16:48
Merci beaucoup, ça fonctionne
Publicado el 06,diciembre 2019 - 08:24
Je cherche maintenant a savoir si il y a une carte dans le lecteur
Existe t'il une façon simple de faire ca. Je regarde du coté de SCardStatusA mais je bloque
Miembro registrado
948 mensajes
Publicado el 06,diciembre 2019 - 12:19
Bonjour
D'après ce que je viens de lire, il faut utiliser en premier «SCardConnectA» qui vous renvoie :
Success SCARD_S_SUCCESS.
ou
An error code. For more information, see Smart Card Return Values -> https://docs.microsoft.com/fr-fr/windows/win32/secauthn/authentication-return-values

--
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai.
Quand un utilisateur vous a aidé, n'oubliez pas de le remercier...
Publicado el 06,diciembre 2019 - 19:06
Merci, cependant J'ai testé le code suivant, mais à priori j'obtiens systématiquement une erreur, que mon lecteur contienne une carte ou pas

Le seule moment ou je n'ai pas d'erreur c'est quand je spécifie lp1 =3, mais dans ce cas j'obtiens toujours 0, avec ou sans carte

p1 est un entier sur 4
p2 est un entier sur 4
lp1 est un entier sur 4=0
lp2 est un entier sur 4=0

p1 est un entier sur 4
p2 est un entier sur 4
lp1 est un entier sur 4=2
lp2 est un entier sur 4=0

nresult is int = API("Winscard.dll","SCardConnectA",int_gestionnaireContexte,"Identive CLOUD 2700 R Smart Card Reader 0",lp1,lp2,&p1,&p2)

SI nresult<>0 ALORS
Info("Erreur connexion "+nresult)
ELSE
Info("connexion ok")
END
Miembro registrado
948 mensajes
Publicado el 06,diciembre 2019 - 22:11
Bonsoir,
Essayez de passer la chaine de caractères par adresse car la fonction attend un LPCSTR pour szReader
szReader est une chaîne ASCIIZ sur 64 = "Identive CLOUD 2700 R Smart Card Reader 0"
API("Winscard.dll","SCardConnectA",int_gestionnaireContexte, &szReader, lp1,lp2,&p1,&p2)


--
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai.
Quand un utilisateur vous a aidé, n'oubliez pas de le remercier...
Mensaje modificado, 06,diciembre 2019 - 22:11
Miembro registrado
948 mensajes
Publicado el 06,diciembre 2019 - 22:35
J'essaierais ces valeurs pour p1 et p2 :

SCARD_SHARE_SHARED: DWORD = 2 donc 2 pour p1 (dwShareMode)

SCARD_PROTOCOL_T0 = 1
SCARD_PROTOCOL_T1 = 2 donc 3 pour p2 (dwPreferredProtocols)

--
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai.
Quand un utilisateur vous a aidé, n'oubliez pas de le remercier...
Publicado el 07,diciembre 2019 - 09:19
Ca fonctionne
Merci !