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

MFC Discussion :

appel d'un objet depuis un callback


Sujet :

MFC

  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur ASP.Net - disponible pour des missions
    Inscrit en
    Septembre 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ASP.Net - disponible pour des missions

    Informations forums :
    Inscription : Septembre 2008
    Messages : 151
    Par défaut appel d'un objet depuis un callback
    Bonjour,

    je travaille sur un ActiveX développé autour d'une api, cet ActiveX permet de piloter un lecteur de chèque

    cet ActiveX déclenche un événement à destination de l'application cliente (vb6 delphi ...) à chaque passage d'un chèque

    et tout fonctionne bien

    mais je dois maintenant déclencher cet événement depuis un callback matériel, et c'est là que ça ne marche pas

    voici ce que j'ai fait, j'ai ajouté une variable qui référence l'objet au moment de sa construction (laclasse=this), de façon à pouvoir déclencher l'événement dans le callback (laclasse->docdone())

    mais le programme reste bloquer au niveau de laclasse->docdone, sans message d'erreur

    si par contre j'appel une fonction lambda de mon objet ça passe bien, c'est uniquement quand je déclenche un événement, auriez-vous une idée

    merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    CCR190Ctrl* laclasse;
     
    CCR190Ctrl::CCR190Ctrl()
    {
       laclasse=this;
    }
     
    void WINAPI CallBackFromDriver(DWORD dwReason, LPARAM lParam, INT32 nStatus)
    {
        laclasse->docdone();
    }

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Ca ne va pas répondre à ta question car cela dépend beaucoup de la fonction docdone. Sans le code de celle ci, difficile de comprendre ce qu'il se passe. Il est possible que la callback soit appelée avant que l'objet ait été initialisé.

    Ce que je te propose pour ta classe de gestion du périphérique :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <Windows.h>
    class CCR190Ctrl
    {
    public:
       static void install();
     
    private:
       CCR190Ctrl()
       {}
       ~CCR190Ctrl(){}
       CCR190Ctrl(CCR190Ctrl const&);// = delete
       CCR190Ctrl&operator=(CCR190Ctrl const&); // = delete
     
       static void WINAPI CallBackFromDriver(DWORD dwReason, LPARAM lParam, INT32 nStatus);
     
     
       void docdone();
     
       static CCR190Ctrl& GetInstance();
     
    };
     
    CCR190Ctrl& CCR190Ctrl::GetInstance()
    {
       static CCR190Ctrl theInstance;
       return theInstance;
    }
     
    void CCR190Ctrl::install()
    {
       // installation du matériel et enregistrement des callbacks;
    }
     
    void WINAPI CCR190Ctrl::CallBackFromDriver(DWORD dwReason, LPARAM lParam, INT32 nStatus)
    {
       GetInstance().docdone();
    }
     
    void CCR190Ctrl::docdone()
    {
       // do it
    }
    Ca permet de masquer en interne les détails d'implémentation de la classe de ton gestionnaire de périphériques comme le fait qu'il existe un seul gestionnaire et qu'il a charge de dialoguer avec le périphérique.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur ASP.Net - disponible pour des missions
    Inscrit en
    Septembre 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ASP.Net - disponible pour des missions

    Informations forums :
    Inscription : Septembre 2008
    Messages : 151
    Par défaut
    merci pour ton aide, je vais essayer de déclarer le callback comme faisant partie de l'objet plutôt que de passer par ma bidouille avec laclasse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      static void WINAPI CallBackFromDriver(DWORD dwReason, LPARAM lParam, INT32 nStatus);

    sinon voici un code plus complet, rien de particulier, j'initialise mes variables et j'appel docdone, et c'est sur le docdone que le programme est figé, par contre si je déclenche docdone ailleurs que dans le callback ça fonctionne
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    void WINAPI CCR190Ctrl::CallBackFromDriver(DWORD dwReason, LPARAM lParam, INT32 nStatus)
    {
            CString stmp;
    	CString stmpTout;
    	int l_ZoneLu = 0;
    
            ... ici du code de traitement image mais que j'ai enlevé pour la phase de debogage ...
    
    	stmpTout="!";
    	ZeroMemory(cBuffer, sizeof(cBuffer));
    	ZeroMemory(cBufferTout, sizeof(cBufferTout));
    	ZeroMemory(cBufferBAS, sizeof(cBufferBAS));
    	ZeroMemory(cBufferHAUT, sizeof(cBufferHAUT));
    	ZeroMemory(cBufferDROITE, sizeof(cBufferDROITE));
    	ZeroMemory(cBufferGAUCHE, sizeof(cBufferGAUCHE));
    	ZeroMemory(cBufferCMC7, sizeof(cBufferCMC7));
    	ZeroMemory(cBufferOCR, sizeof(cBufferOCR));
    	ZeroMemory(cBufferFULL, sizeof(cBufferFULL));
    
    	ZeroMemory(cAnoBAS, sizeof(cAnoBAS));
    	ZeroMemory(cAnoHAUT, sizeof(cAnoHAUT));
    	ZeroMemory(cAnoDROITE, sizeof(cAnoDROITE));
    	ZeroMemory(cAnoGAUCHE, sizeof(cAnoGAUCHE));
    	ZeroMemory(cAnoCMC7, sizeof(cAnoCMC7));
    	ZeroMemory(cAnoOCR, sizeof(cAnoOCR));
    	ZeroMemory(cAnoFULL, sizeof(cAnoFULL));
    
    	ZeroMemory(cAnoBASDecode, sizeof(cAnoBASDecode));
    	ZeroMemory(cAnoHAUTDecode, sizeof(cAnoHAUTDecode));
    	ZeroMemory(cAnoDROITEDecode, sizeof(cAnoDROITEDecode));
    	ZeroMemory(cAnoGAUCHEDecode, sizeof(cAnoGAUCHEDecode));
    	ZeroMemory(cAnoCMC7Decode, sizeof(cAnoCMC7Decode));
    	ZeroMemory(cAnoOCRDecode, sizeof(cAnoOCRDecode));
    	ZeroMemory(cAnoFULLDecode, sizeof(cAnoFULLDecode));
    
    	ZeroMemory(cBufferVF1, sizeof(cBufferVF1));
    	ZeroMemory(cBufferVF2, sizeof(cBufferVF2));
    	ZeroMemory(cBufferVF3, sizeof(cBufferVF3));
    	ZeroMemory(cBufferVF4, sizeof(cBufferVF4));
    	ZeroMemory(cBufferVF5, sizeof(cBufferVF5));
    
    	/// event ///
    	sprintf_s(cBufferTout, "%s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c %s%c"
    		,cBufferBAS, 0x21, cAnoBAS, 0x21 , cAnoBASDecode , 0x21
    		,cBufferHAUT, 0x21, cAnoHAUT, 0x21 , cAnoHAUTDecode , 0x21
    		,cBufferDROITE, 0x21, cAnoDROITE, 0x21, cAnoDROITEDecode , 0x21
    		,cBufferGAUCHE, 0x21, cAnoGAUCHE, 0x21, cAnoGAUCHEDecode , 0x21
    		,cBufferCMC7, 0x21, cAnoCMC7, 0x21, cAnoCMC7Decode , 0x21
    		,cBufferOCR, 0x21, cAnoOCR, 0x21, cAnoOCRDecode , 0x21
    		,cBufferFULL, 0x21, cAnoFULL, 0x21, cAnoFULLDecode , 0x21
    		,"", 0x21
    		,cBufferVF1, 0x21, cBufferVF2, 0x21, cBufferVF3, 0x21, cBufferVF4, 0x21, cBufferVF5, 0x21);
    	stmpTout =  cBufferTout;
    	BSTR bsOUT = stmp.AllocSysString();
    	BSTR bsOUTTout = stmpTout.AllocSysString();
    	laclasse->docDone(m_docCount, m_iProduit, bsOUT, bsOUTTout, l_ZoneLu);
    	SysFreeString(bsOUT);
    	SysFreeString(bsOUTTout);
    }
    la déclaration de docdone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    protected:
    	void docDone(LONG numero, LONG produit, LPCTSTR ligne, LPCTSTR lignetout, LONG zonelu)
    	{
    		FireEvent(eventiddocDone, EVENT_PARAM(VTS_I4 VTS_I4 VTS_BSTR VTS_BSTR VTS_I4), numero, produit, ligne, lignetout, zonelu);
    	}
    et ici le code client (vb6) qui récupère le docdone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CR1901_docDone(ByVal numero As Long, ByVal produit As Long, ByVal ligne As String, ByVal lignetout As String, ByVal zonelu As Long)
       ... insertion en db ...
    End Sub

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/05/2014, 08h16
  2. Réponses: 4
    Dernier message: 11/10/2011, 14h34
  3. appel depuis un callback
    Par vhoward99 dans le forum Débuter
    Réponses: 12
    Dernier message: 05/09/2011, 13h00
  4. Réponses: 1
    Dernier message: 27/08/2009, 16h32
  5. [POO] Appel d'un objet d'un formulaire d'une fenetre depuis une pop up
    Par shaun_the_sheep dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/10/2006, 11h34

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