IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Ecrire/lire Carte sur la pointeuse


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut Ecrire/lire Carte sur la pointeuse
    Bonjour

    Je veux envoyer (écrire/lire) le N° de la carte biométrique de chaque employé vers l'appareil "pointeuse ZK teco"
    J'utilise le code suivant mais ça n'a pas marché

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    zKemKeeper>>SetStrCardNumber(sCarte)
    zKemKeeper>>WriteCard(MachineNumber, sdwEnrollNumber, idwFingerIndex, sTmpData)
    Est ce quelque 'un déjà arrive à écrire/lire la carte de l'employé ?

    Merci d'avance de me donner exactement la fonction qui permet d'effectuer ce travail

  2. #2
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 810
    Points : 5 269
    Points
    5 269
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Ce sont des fonctions issues d'un assemblage, d'une API ?
    Que dit la doc de l'appareil concernant ces fonctions ?
    Que représentent les paramètres ?
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    Bonjour,
    Ce sont des fonctions issues d'un assemblage, d'une API ?
    Que dit la doc de l'appareil concernant ces fonctions ?
    Que représentent les paramètres ?

    Merci pour ton retour

    Pour la lecture ca passe bien grâce à la fonction zKemKeeper>>GetStrCardNumber(sCarte).

    Par contre la fonction pour écrire zKemKeeper>>SetStrCardNumber(sCarte) l'enregistrement ca passe dans la pointeuse mais il enregistre le dernier n° de la carte existant dans la pointeuse par exemple : dernier numéro de la carte déjà enregistré dans la pointeuse est "12548796"
    le n° de la carte que je souhaite écrire dans la pointeuse pour un nouveau employé est "33333333" mais il enregistre "12548796" au lieu de "33333333"

    Mon problème est l'initialisation de la variable sCarte, sachant que je met scarte ="" avant chaque lecture

    La doc :
    3.4 CardNumber
    Usage: Set or read the card number of a user. If this attribute is unavailable, use GetStrCardnumber and SetStrCardnumber instead.
    Type: LONG, readable/writable

    [Definition]
    VARIANT_BOOL SetStrCardNumber([in] BSTR ACardNumber)
    [Usage]
    Set the value of cardnumber of the SDK. Generally, this function can be used to set the card number of a user before the user information is set.
    [Parameter]
    AcardNumber
    Card number
    [Return Value]
    Return True if it is successful, or return False.
    [Related Function]
    SetUserInfo

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 810
    Points : 5 269
    Points
    5 269
    Billets dans le blog
    1
    Par défaut
    Le problème doit venir de ta chaîne.
    SetStrCardNumber attend un BSTR en paramètre. A savoir une NTS (null terminated string, type ASCCIZ en WL) en UNICODE précédé de la taille (sur 4 octets) de la chaîne (sans le \0 de fin).
    Toutefois ta doc précise que l'on peut accéder directement au N° de la carte (entier de type long, entier sur 8 en WL)
    Une autre solution (non testée) pourrait être l'utilisation d'une variable composée.
    Lorsque l'on utilise une BSTR, c'est l'adresse du début de la chaîne qui est passée, la taille de la chaîne est automatiquement lue. il suffit alors de calculer la taille de la chaine (et de la multiplier par 2 car la data string est en unicode)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    vcNoCarteEmployé est composée de
         nTaille est entier sur 4
         szNoCarte est chaine ASCIIZ sur 255 //On doit préciser la taille max
    FIN
     
    vcNoCarteEmployé.szNoCarte="33333333"
    vcNoCarteEmployé.nTaille=2*(Taille(vcNoCarteEmployé.szCode))
     
    zKemKeeper>>SetStrCardNumber(vcNoCarteEmployé.szNoCarte)
    Eventuellement, il faudra passer par la variable composée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    vcNoCarteEmployé est composée de
         nTaille est entier sur 4
         suNoCarte est chaine Unicode sur 255 //La taille est obligatoire sinon l'adresse ne sera pas &nTaille+4 sauf si on la force
         cNull est caractère
    FIN
    vcNoCarteEmployé.cNull=Caract(0)
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut
    Merci pour ton retour

    J'ai testé ton code mais toujours le même problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vcNoCarteEmployé est composée de
    	nTaille		est entier sur 4
    	szNoCarte	est chaîne ASCIIZ sur 255	//On doit préciser la taille max
    	cNull		est caractère
    FIN
    vcNoCarteEmployé.cNull=Caract(0)
     
    vcNoCarteEmployé.szNoCarte	= "33333333"
    vcNoCarteEmployé.nTaille	= 2*(Taille(vcNoCarteEmployé.szNoCarte))
    SI zKemKeeper>>SSR_SetUserInfo(MachineNumber, sdwEnrollNumber, sName, sPassword, iPrivilege_ID, bEnabled) ALORS // Upload user information to the device
    	//Télécharger les informations sur l'appareil 
    	zKemKeeper>>SetUserTmpExStr(MachineNumber, sdwEnrollNumber, idwFingerIndex, iflag, sTmpData)  
    	zKemKeeper>>SetStrCardNumber(vcNoCarteEmployé.szNoCarte)
    FIN
    Le problème est qu'il prend le dernier numéro de carte enregistré dans la pointeuse et l'attribue au nouvel enregistrement

  6. #6
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 810
    Points : 5 269
    Points
    5 269
    Billets dans le blog
    1
    Par défaut
    Étant donné le nom des fonctions, j'ai l'impression qu'elles préparent les données. Il doit y avoir une fonction qui charge ces données dans le buffer de l'appareil, au même titre que SSR_SetUserInfo récupère les données utilisateur.
    Il te faut une fonction avec MachineNumber et le No de carte
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    La doc dit que la fonction SetStrCardNumber peut éventuellement planter, donc testons si elle plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    vcNoCarteEmployé est composée de
    	nTaille		est entier sur 4
    	szNoCarte	est chaîne ASCIIZ sur 255	//On doit préciser la taille max
    	cNull		est caractère
    FIN
    vcNoCarteEmployé.cNull=Caract(0)
     
    vcNoCarteEmployé.szNoCarte	= "33333333"
    vcNoCarteEmployé.nTaille	= 2*(Taille(vcNoCarteEmployé.szNoCarte))
    SI zKemKeeper>>SSR_SetUserInfo(MachineNumber, sdwEnrollNumber, sName, sPassword, iPrivilege_ID, bEnabled) ALORS // Upload user information to the device
    	//Télécharger les informations sur l'appareil 
    	zKemKeeper>>SetUserTmpExStr(MachineNumber, sdwEnrollNumber, idwFingerIndex, iflag, sTmpData)  
            si 	zKemKeeper>>SetStrCardNumber(vcNoCarteEmployé.szNoCarte)  alors
               trace ( " ok Set " + vcNoCarteEmployé.szNoCarte )
            sinon
               erreur ( " plantage set " + vcNoCarteEmployé.szNoCarte )
            fin
    FIN
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #8
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 810
    Points : 5 269
    Points
    5 269
    Billets dans le blog
    1
    Par défaut
    Par contre attention, la data string (szNoCarte) est une chaîne UNICODE sur x.
    La doc précise aussi que la fonction SetStrCardNumber est utilisée pour initialiser la carte d'un utilisateur avant que ces données ne soient affectées, pas après.
    L'ordre devrait donc être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
            SI 	zKemKeeper>>SetStrCardNumber(vcNoCarteEmployé.szNoCarte)  ALORS
               zKemKeeper>>SetUserTmpExStr(MachineNumber, sdwEnrollNumber, idwFingerIndex, iflag, sTmpData)  
               trace ( " ok Set " + vcNoCarteEmployé.szNoCarte )
            SINON
               erreur ( " plantage set " + vcNoCarteEmployé.szNoCarte )
           FIN
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    Par contre attention, la data string (szNoCarte) est une chaîne UNICODE sur x.
    La doc précise aussi que la fonction SetStrCardNumber est utilisée pour initialiser la carte d'un utilisateur avant que ces données ne soient affectées, pas après.
    L'ordre devrait donc être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
            SI 	zKemKeeper>>SetStrCardNumber(vcNoCarteEmployé.szNoCarte)  ALORS
               zKemKeeper>>SetUserTmpExStr(MachineNumber, sdwEnrollNumber, idwFingerIndex, iflag, sTmpData)  
               trace ( " ok Set " + vcNoCarteEmployé.szNoCarte )
            SINON
               erreur ( " plantage set " + vcNoCarteEmployé.szNoCarte )
           FIN

    Merci pour vos aides

    J'ai résolu mon problème
    Avant d'utiliser la fonction SetUserInfo, définissez le numéro de carte pour vous assurer que vous pouvez le télécharger sur l'appareil

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecrire & Lire des énumérés dans un fichier Texte
    Par WebPac dans le forum Langage
    Réponses: 8
    Dernier message: 18/06/2008, 10h04
  2. Réponses: 6
    Dernier message: 14/11/2006, 15h52
  3. lire/écrire sur un port com sans le monopoliser
    Par totofweb dans le forum Windows
    Réponses: 4
    Dernier message: 26/07/2004, 13h23
  4. [VMR9][D3D9]ecrire un texte sur une surface
    Par drizztfr dans le forum DirectX
    Réponses: 2
    Dernier message: 13/11/2003, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo