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

 C++ Discussion :

Récuperer evenements Com


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut Récuperer evenements Com
    Bonjour à tous,

    Je me suis deja servi de C++ sur différents projets. Cependant dans un projet je suis amené a dialoguer avec un periphérique (caméra infrarouge USB) via la librairie Com. Pour récupérer une image, je dois utiliser un evenement OnFrameAvailable, mais je ne parviens pas a récuperer cet evenement. J'ai tenter d'utiliser des Sink, mais rien n'y fait. Je suis assez novice avec la bibliothèque COM et les evenements.

    J'arrive a dialoguer avec ma caméra, mais si je recupere une image sans l'evenement, il y a une chance sur 4 pour que se passe un Access Violation:
    Je me suis inspiré des exemples fourni avec le SDK de la cam,cherché sur le net, mais rien n'y fait. Le problème vient il du fait que je suis avec une application console et pas une app MFC ?

    Si qqun pouvait m'aider, voici mon code:
    Merci

    CameliaTests.cpp
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
     
    #include "stdafx.h"
    #include <windows.h>
     
    #include "CameliaTests.h"
    #include <wrapper.h>
     
    #include <atlbase.h>
    #include <atlcom.h>
     
    #include <optitrack.h>
    #import  "optitrack.tlb"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
    #define CALL( x ) printf("\n%s: "#x"\n", ((x)==S_OK) ? "passed" : "FAILED");
     
    // The one and only application object
    CWinApp theApp;
     
    using namespace std;
     
    /* Class to handle Events
     *
     */
    class Tests: public CCameraEvents{
     
    public:	
     
    	CComPtr<INPCameraCollection> collection;
    	CComPtr<INPCamera> m_spCamera;    
    	HRESULT Init();
    private:
     
    	void __stdcall HandleFrameAvailable(INPCamera * pCamera);
    };
     
     
    void __stdcall Tests::HandleFrameAvailable(INPCamera * pCamera) {
    	printf("non");
    }
     
    HRESULT Tests::Init(){
    	CoInitialize(NULL);
    	// Create Collection
    	collection.CoCreateInstance(CLSID_NPCameraCollection);
     
    	// Initialize a list of camera
    	collection->Enum();
    	// Get first camera
    	collection->Item(0,&m_spCamera);
    	// Register this as an event handler
    	this->DispEventAdvise(m_spCamera);
     
    	// Open the camera
    	m_spCamera->Open();
    	m_spCamera->Start();
    	int i = 0;
    	while(i < 200){
    		Sleep(10);
    		i++;
    		printf("_");
    	}
    	this->DispEventUnadvise(m_spCamera);
    	m_spCamera->Stop();
    	m_spCamera->Close();
    	m_spCamera.Release();
    	collection.Release();
     
    	CoUninitialize();
    	return S_OK;
    }
     
     
     
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
     
    	// initialize MFC and print and error on failure
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    	{
    		// TODO: change error code to suit your needs
    		_tprintf(_T("Fatal Error: MFC initialization failed\n"));
    		nRetCode = 1;
    	}
    	else
    	{
    		Tests * t = new Tests();
    		t->Init();
     
    	}
    	return nRetCode;
    }
    et le .h
    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
     
    #pragma once
     
    #include <atlbase.h>
    #include <atlcom.h>
     
    #include "Optitrack.h"
    #include "resource.h"
     
    class CCameraEvents :
        public IDispEventImpl<0, CCameraEvents, &DIID__INPCameraEvents, &LIBID_OptiTrack, 1, 0>
    {
    public:
        CCameraEvents() { ; }
        ~CCameraEvents() { ; }
     
    public:
        // connection point notifications
        STDMETHOD_(void, OnFrameAvailableIdCamera)(INPCamera * pCamera, LONG Group, LONG Id) { HandleFrameAvailable(pCamera);HandleFrameAvailableIdCamera(pCamera, Group, Id); }
        STDMETHOD_(void, OnFrameAvailable)(INPCamera * pCamera) { HandleFrameAvailable(pCamera); }
    	STDMETHOD_(void, FrameAvailable)(INPCamera * pCamera) { HandleFrameAvailable(pCamera); }
        STDMETHOD_(void, OnSwitchChange)(INPCamera * pCamera, LONG lNewSwitchState) { HandleFrameAvailable(pCamera);HandleSwitchChange(pCamera, lNewSwitchState); }
     
        virtual void __stdcall HandleFrameAvailable(INPCamera * pCamera) { printf("non"); }
        virtual void HandleSwitchChange(INPCamera * pCamera, LONG lNewSwitchState) { printf("non"); }
        virtual void HandleFrameAvailableIdCamera(INPCamera * pCamera, LONG Group, LONG Id) { printf("non");}
     
    public:
        BEGIN_SINK_MAP(CCameraEvents)
            SINK_ENTRY_EX(0, DIID__INPCameraEvents, 1, OnFrameAvailable)
            SINK_ENTRY_EX(0, DIID__INPCameraEvents, 2, OnSwitchChange)
            SINK_ENTRY_EX(0, DIID__INPCameraEvents, 3, OnFrameAvailableIdCamera)
        END_SINK_MAP()
     
    };

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ah, je ne suis pas doué pour les événements COM avec ATL, surtout qu'ils sont invoqués par IDIspatch en plus...

    Mais deux trucs me paraissent bizarre :
    • Ta boucle avec Sleep(). Pour moi, il faudrait qu'il y ait une vraie boucle de messages à la place...
    • Le fait qu'il y ait quatre fonctions dans CCameraEvents, alors qu'il n'y a que trois événements.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut
    Salut,

    Merci pour ta réponse.
    Que veux tu dire par une vraie boucle de reception de message ?
    Ce genre de boucle marchent elle pour une appli console ?
    Merci
    Qqchose du genre de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	                MSG msg;
                        if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
                        {
                            if(GetMessage( &msg, NULL, 0, 0 ) )
                            {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                            }
                        }
    J'avoue ne pas avoir trop bien compris l'interet de cette boucle... Elle me generait une erreur quand je l'avais implenté, je n'ai pas réessayé depuis !

    D'ailleurs en retestant, j'ai toujours une erreur à "EnterCritical..." dans atlcore.h, c'est un Access Violation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	HRESULT Lock() throw()
    	{
    		EnterCriticalSection(&m_sec);  // <<<<<<<< erreur ici
    		return S_OK;
    	}

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut
    Petit up, car meme en utilisant une pauvre fenetre MFC... ca ne marche pas !
    J'ai regardé la MSDN et tou, mais rien ne m'aide lol !

    Si vous avez des tutos bien fait, je prends !

Discussions similaires

  1. Récuperer evenement clavier hors focus
    Par Au_secours dans le forum Windows
    Réponses: 1
    Dernier message: 24/04/2009, 18h20
  2. Récuperer evenements Com
    Par PsyKo BoY dans le forum MFC
    Réponses: 2
    Dernier message: 04/11/2008, 10h28
  3. Evenements COM : Erreur du __hook
    Par gbraux dans le forum Windows
    Réponses: 4
    Dernier message: 22/11/2007, 23h26
  4. [EVENEMENT] Developpez.com à l'Apple Expo
    Par gibet_b dans le forum Apple
    Réponses: 3
    Dernier message: 30/09/2007, 18h14
  5. Récuperation evenement molette / défilement horizontal
    Par kalan dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/10/2006, 14h40

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