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 :

Récuperer evenements Com


Sujet :

MFC

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,

    Je dois réaliser un projet utilisant une caméra USB dialoguant via COM (caméra Optitrack pour les intéressés).
    Je compte utiliser MFC pour l'interface et il me faut donc récuperer des évenments COM afin d'éviter certains bug liés a la caméra.
    Par exemple, lorsqu'une nouvelle caméra est dispo, un evenement OnDeviceArrival est appelé.
    J'ai tenter des recherches sur le Net, sur la MSDN mais rien n'y fait, je n'arrive pas à récuperer ces evenements.

    Je pense utiliser les bon IID, et tout.... mais il doit y avoir quelquechose que je ne comprends pas.

    Voici mon code (très basique), si qqun peux y jeter un coup d'oeil:
    Merci d'avance

    Fichier First_MFC_Window.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
     
    //MFC1.CPP - MFC Tutorial Part 1
     
    #include <stdafx.h>
     
    #include <afxwin.h>
    #include <afxctl.h>
     
    #include "CameraEvents.h"
    #include "MySink.h"
    #include <iostream>
     
    #include <optitrack.h>
    #import  "optitrack.tlb"
     
    #include "MySink.h"
     
    class MFC_Tutorial_Window :public CFrameWnd
    {
    public:
    	CComPtr<INPCameraCollection> collection;
    	CComPtr<INPCamera> camera;  
        CMySink * mySink;
     
    	MFC_Tutorial_Window()
        {				
            Create(NULL,_T("Test"));		
     
     
    		// Initialize Windows stuffs...
    		CoInitialize(NULL);
    		// Create collection of camera
    		collection.CoCreateInstance(CLSID_NPCameraCollection);
     
    		// Start the event handler		
    		mySink = new CMySink();	
    		LPUNKNOWN pUnkSink = mySink->GetIDispatch(FALSE);
    		DWORD id;
    		AfxConnectionAdvise(collection,DIID__INPCameraCollectionEvents,pUnkSink,FALSE, &id);
    		// Gather all the cameras
     
    		collection->Enum();
    		// Get the first camera
    		collection->Item(0, &camera);
     
     
    		AfxConnectionUnadvise(collection, DIID__INPCameraCollectionEvents, pUnkSink, FALSE, id);
    		// Stop the event handler
    		delete mySink;
    		//collectionEvents.DispEventUnadvise(collection);
    		// Realease the collection 
    		collection.Release();
    		// and the camera
    		camera.Release();
    		// Uninitialize...
    		CoUninitialize();
     
        }
     
     
    };
     
     
    class MyApp :public CWinApp
    {
       MFC_Tutorial_Window *wnd; 
    public:
       BOOL InitInstance()
       {
           wnd = new MFC_Tutorial_Window();
           m_pMainWnd = wnd;
           m_pMainWnd->ShowWindow(SW_SHOW);	
           return TRUE;
       }
    };
     
    MyApp theApp;
    //End of program MFC Tutorial Part 1

    Fichier MySink.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
     
     
    #pragma once
    #include <optitrack.h>
    #import  "optitrack.tlb"
     
     
    // Cible de la commande CMySink
     
    class CMySink : public CCmdTarget
    {
    	DECLARE_DYNAMIC(CMySink)
     
    public:
    	CMySink();
    	virtual ~CMySink();
     
    	virtual void OnFinalRelease();
    	void HandleFrameAvailable(INPCamera *cam);
     
    protected:
    	DECLARE_MESSAGE_MAP()
    	DECLARE_DISPATCH_MAP()
    	DECLARE_INTERFACE_MAP()
    };

    et le fichier MySink.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
     
    // MySink.cpp : fichier d'implémentation
    //
     
    #include "afxctl.h"
    #include "MySink.h"
    #include <optitrack.h>
    #import  "optitrack.tlb"
     
    // CMySink
    IMPLEMENT_DYNAMIC(CMySink, CCmdTarget)
     
    CMySink::CMySink()
    {
    	EnableAutomation();
    }
     
    CMySink::~CMySink()
    {
    }
     
     
    void CMySink::HandleFrameAvailable(INPCamera *cam){
    	MessageBox(NULL,_T("Pilllllum."), _T("Error"),MB_ICONINFORMATION | MB_OK);
    }
    void CMySink::OnFinalRelease()
    {
    	// Lorsque la dernière référence pour un objet automation est libérée
    	// OnFinalRelease est appelé. La classe de base supprime automatiquement
    	// l'objet. Un nettoyage supplémentaire est requis pour votre
    	// objet avant d'appeler la classe de base.
     
    	CCmdTarget::OnFinalRelease();
    }
     
     
    BEGIN_MESSAGE_MAP(CMySink, CCmdTarget)
     
    END_MESSAGE_MAP()
     
     
    BEGIN_DISPATCH_MAP(CMySink, CCmdTarget)
    	DISP_FUNCTION_ID(CMySink,"OnDeviceArrival",0,HandleFrameAvailable,0,0)
    END_DISPATCH_MAP()
     
    // {4BE437DA-DDAA-4967-BFB7-477929A86010}
    static const IID IID_IMySink = { 0x4BE437DA, 0xDDAA, 0x4967, { 0xBF, 0xB7, 0x47, 0x79, 0x29, 0xA8, 0x60, 0x10 } };
     
    BEGIN_INTERFACE_MAP(CMySink, CCmdTarget)
    	INTERFACE_PART(CMySink, DIID__INPCameraCollectionEvents, Dispatch)
    END_INTERFACE_MAP()
     
     
    // Gestionnaires de messages de CMySink

  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
    Bonjour,
    Ca ne résoudra probablement pas ton problème mais MS recommande d'utiliser CoInitializeEx à la place de CoInitialize. Traditionnellement, on le fait plutôt dans InitInstance (un appel par thread) et on n'oublie pas l'appel à CoUninitialize (dans l'ExitInstance).
    Cordialement.

  3. #3
    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
    Je crois que sous MFC, on utilise plutôt AfxEnableControlContainer() que CoInitialize[Ex](), non?
    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.

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 Débuter
    Réponses: 3
    Dernier message: 28/10/2008, 15h23
  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