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

VB.NET Discussion :

utiliser une fonction de callback ? methode ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut utiliser une fonction de callback ? methode ?
    Bonjour,

    J'essaie de réaliser un petit outil permettant de lire des cartes sans contact à partir d'un lecteur. Pour cela j'utilise une API sous forme de dll.
    Pour le moment j'ai créé une IHM avec un bouton, lorsque je clique sur ce bouton ca permet d'executer le polling sur le lecteur de carte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Button1Click(sender As Object, e As EventArgs)
    		MyReader.CSCReaderStartPollingEx()
    	End Sub
    Lorsque je pose une carte sur le lecteur, le lecteur fait appel à la fonction de callback et permet de récuperer des infos sur le status du lecteur (carte détecté, type de carte,...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class CscApi
     
    Property CscReaderStatus As StatusCSC = Nothing
     
    <UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)>
    Private Delegate Sub fCallBackEx (ByVal hCsc As System.UInt32, byref pxStatusCSC As StatusCSC)
     
    Public Sub CallBackExFunc (ByVal hCsc As System.UInt32, byref pxStatusCSC As StatusCSC)
    	Me.CscReaderStatus = pxStatusCSC
    End Sub
     
    End Class
    Tout fonctionne bien, le problème est que je ne sais pas quoi faire une fois que le lecteur fait appel à la fonction de callback, par exemple je devrais une fois la carte détecté , lire le contenu de la carte avec une fonction de l'api, mais dans la documentation de l'api il est conseillé de ne pas faire appel à une autre fonction de l'api dans la fonction de callback elle meme.

    Pour le moment dans la fonction de callback je stocke le contenu de l'état du lecteur (comme conseillé dans la documentation), mais apres je ne sais pas comment déclencher un évenement ou autre chose pour pouvoir executer une autre fonction.

    Voici ce qui est écrit dans la doc de l'API sur la fonction de callback

    Here, you should save the content pointed to by <pxStatusCSC >
    * and set a synchronization object with your application
    Je ne sais comprend pas du tout ce que l'on entend par "set a synchronization object with your application ? Si quelqu'un pouvait m'aiguiller ou me donner un exemple, ca m'aiderait beaucoup

    Merci par avance.

    cdt,
    yaume

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut
    Bonsoir,

    Je relance mon sujet car je suis vraiment perdu. Je ne sais pas du tout comment m'y prendre, et certainement que tout n'est pas clair pour moi (et du coup peut etre que je m'exprime mal dans ma question), je vais donc essayer d'etre un peu plus clair:

    J'ai créé une IHM avec un bouton.
    Lorsque je clique sur ce bouton, j'execute une fonction d'une API(dll) qui lance la detection de carte sur mon lecteur de carte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Button1Click(sender As Object, e As EventArgs)
                   'j'appel la methode CSCReaderStartPollingEx avec mon objet "MyReader" que j'ai créé en amont
    		MyReader.CSCReaderStartPollingEx()
    	End Sub
    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
    19
    20
    21
    22
    23
    24
    Public Class Api
     
    'import de la fonction de polling de la dll
    <DllImport("CscApi.dll", EntryPoint:="sSmartStartPollingEx", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
    Private Shared Function sSmartStartPollingEx(byval hCsc As System.UInt32, byval ucNumScenario As System.Byte, byval xAC As eTypACType, byval ucSpontCall As System.Byte, byval pvCallBackEx As fCallBackEx) As System.Int16
    End Function
     
    'déclaration du délégué de la fonction de callback
    <UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)>
    Private Delegate Sub fCallBackEx (ByVal hCsc As System.UInt32, byref pxStatusCSC As StatusCSC)
     
    Public Sub CSCReaderStartPollingEx()
    	'Configuration de la routine de callback
    	Dim ProcedurepCallBackExFunc As New fCallBackEx(AddressOf Me.CallBackExFunc)
            'fonction de l'API qui lance la detection (polling) sur le lecteur
    	ApiReturn = sSmartStartPollingEx(Me.CscReaderHandle,1,eTypACType.AC_WITHOUT_COLLISION,1,ProcedurepCallBackExFunc) 
    End Sub
     
    'fonction de callback appelé par l'API (si j'ai bien compris le fonctionnement) lorsqu'une carte est posé sur le lecteur
    Private Sub CallBackExFunc (ByVal hCsc As System.UInt32, byref pxStatusCSC As StatusCSC)
    	Me.CscReaderStatus = pxStatusCSC   'Je mémorise le status remonté par l'API lorsque la carte a été posé sur le lecteur qui permet de récuperer des infos sur la carte (type de carte, etc
    End Sub
     
    End Class
    Lorsque je clique sur le bouton de l'IHM, la detection de carte devient active sur le lecteur, le code a fini de s'executer dans mon bouton "Button1Click".

    Du coup des que je pose une carte sur le lecteur, la fonction de callback s'execute, mais apres si je souhaite exploiter les infos que j'ai recuperer dans cette fonction, je ne sais pas comment faire sans rester dans la fonction de callback.

    Voilà pas évident d'expliquer quand on se sent perdu, peut etre que je m'yprend mal, en regardant je me disait qu'il fallait peut etre utiliser des fonctions asynchrone afin de ne pas rester bloquer dans la fonction de callback, mais voila j'ai l'impression d'etre dans le flou.

    Merci d'avoir pris le temps de me lire, je suis preneur de toute remarque.

    cdt,
    yaume

  3. #3
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Je pense que StatusCSC est une structure, nan ??
    De l'API sans structure c'est plutôt rare....... à voir ......

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut
    oui c'est une structure, elle permet de connaitre l'état du lecteur "ucStatCSC" prend la valeur "CARD_ON" dés qu'une carte est détecté

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct
    {
        UCHAR           ucStatCSC;
        UCHAR           ucNbDetectedCard;
        eTypCardType    xCardType;
        UCHAR           ucAntenna;
        UCHAR           ucLgATR;
        UCHAR           ucATR[MAX_ATR_SIZE];
    } StatusCSC;

    Lorsque j'appelle la fonction "sSmartStartPollingEx" de l'API, l'API exécute la fonction de callback dés qu'une carte est détecté sur le lecteur.
    Dés qu'une carte est détecté je peux (et je dois stocké cette structure depuis la routine de callback car pxStatusCSC est perdu une fois sorti de la routine de callback).

    Dans la spec il est indiqué qu'il ne faut pas rester dans la routine de callback pour exécuter d'autres fonction de l'API, mais c'est ce que je n'arrive pas à faire, pour le moment j'appelle une fonction à partir de cette fonction de callback mais en mode synchrone (si j'ai bien tout compris ce que j'ai lu sur le sujet)

    si j'ai bien compris faudrait que je sois en mode asynchrone , mais tout ce que j'ai lu sur le sujet reprend toujours des exemples avec des api windows du coup j'arrive pas à faire le lien avec mon api (de plus je pas forcement tout compris sur le sujet )

    En gros faudrait que dans la fonction ou j'appelle "sSmartStartPollingEx" j'attende le résultat de l'execution de la fonction de callback.

    Mais voilà je sais pas comment faire

    Merci

  5. #5
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Tu pourrais mettre en place un gestionnaire d’événement qui sera déclenché depuis ta classe Api dans ta procédure CallBackExFunc.
    Partant du principe où tu as ta routine Button1Click dans une classe nommée Form1 (MainForm ou comme tu veux.... ) dans le constructeur de ce MainForm tu t'abonnes à l'évènement déclaré dans ta classe Api et tu récupères le résultat dans une routine CardConnected(sender as Object, e as CardConnectedEventArgs)...... exemple :

    Classe Api :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Public Class Api
     
        public sub new
        end sub
     
    'Déclaration de l'event
    Public Event CardConnected(sender As Object, e As CardConnectedEventArgs)
     
    'import de la fonction de polling de la dll
    <DllImport("CscApi.dll", EntryPoint:="sSmartStartPollingEx", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
    Private Shared Function sSmartStartPollingEx(byval hCsc As System.UInt32, byval ucNumScenario As System.Byte, byval xAC As eTypACType, byval ucSpontCall As System.Byte, byval pvCallBackEx As fCallBackEx) As System.Int16
    End Function
     
    'déclaration du délégué de la fonction de callback
    <UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)>
    Private Delegate Sub fCallBackEx (ByVal hCsc As System.UInt32, byref pxStatusCSC As StatusCSC)
     
    Public Sub CSCReaderStartPollingEx()
    	'Configuration de la routine de callback
    	Dim ProcedurepCallBackExFunc As New fCallBackEx(AddressOf Me.CallBackExFunc)
            'fonction de l'API qui lance la detection (polling) sur le lecteur
    	ApiReturn = sSmartStartPollingEx(Me.CscReaderHandle,1,eTypACType.AC_WITHOUT_COLLISION,1,ProcedurepCallBackExFunc) 
    End Sub
     
    'fonction de callback appelé par l'API (si j'ai bien compris le fonctionnement) lorsqu'une carte est posé sur le lecteur
    Private Sub CallBackExFunc (ByVal hCsc As System.UInt32, byref pxStatusCSC As StatusCSC)
        'Je déclenche l'event
         RaiseEvent CardConnected(Me, New CardConnectedEventArgs(pxStatusCSC))
    End Sub
     
    End Class
    ---> Création d'une classe CardConnectedEventArgs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public NotInheritable Class CardConnectedEventArgs
        Inherits EventArgs
     
        Public ReadOnly Property Status As StatusCSC
     
        Public Sub New(stat As StatusCSC)
            _Status = stat
        End Sub
     
    End Class
    ---> Dans la classe FormMain

    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
    19
    20
    21
     
     
    Public Class FormMain
     
        Private WithEvents m_MyReader As Api
     
        Public Sub New()
            InitializeComponent()
            m_MyReader = New Api
        End sub
     
        private Sub Button1Click(sender As Object, e As EventArgs)
            'j'appel la methode CSCReaderStartPollingEx avec mon objet "m_MyReader" que j'ai créé en amont
            m_MyReader.CSCReaderStartPollingEx()
        End Sub
     
        Private Sub OnCardConnected(sender As Object, e As CardConnectedEventArgs) Handles m_MyReader.CardConnected
             'Tu récupères ici ta structure avec e.Status
        end sub
     
    End Class
    Je n'ai pas testé car je ne possède pas ton API et de lecteur de carte......... donc il faut tester et adapter le code à tes besoins...
    A tester...

    PS : En tout cas ça m'à l'air d'être un bon projet et tu vas en apprendre beaucoup grâce à cette immersion.

    Bon codage. ++

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut
    Bonjour,

    Merci pour la réponse, j'ai testé avec un event mais le problème est toujours le meme car lorsque l'event est déclenché dans la routine de callback, je saute directement dans la sub Cardconnected, mais ca reste une sous fonction de la routine de callback.
    Ce qu'il me faudrait c'est que la routine de callback s'execute jusqu'au bout, puis que je saute dans la fonction CardConnected.

    D'ou je pense qu'il faudrait que je gère cela de maniere asynchrone (ce que je n'arrive pas à faire).
    Mais bon j'aurai découvert comment créer un event de toute piece.

Discussions similaires

  1. [Débutant] Utiliser une fonction de Callback directement dans le code.
    Par kaker dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 28/03/2012, 13h15
  2. Réponses: 10
    Dernier message: 10/02/2006, 14h23
  3. DAO impossible d'utiliser une fonction dans un requete
    Par exter666 dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/09/2005, 17h15
  4. Utiliser une fonction
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/08/2005, 07h53
  5. utiliser une méthode en callback
    Par inertia dans le forum MFC
    Réponses: 3
    Dernier message: 23/06/2005, 17h56

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