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
Partager