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