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