Bonjour,
Ici je pense que le probleme concerne la Relation/Visibilité des instances et methodes entre les differentes classes d'un projet MFC
Il s'agit d'un projet VC++ auquel j'ai ajouté des fonctions d'un programme console c++ qui lui même utilise une librairie (classe device, device.h) autrement dit il s'agit d'un programme wrappeur (classe device_wrappeur, device_wrappeur.h) qui herite donc de la librairie
Il s'agit donc d'implementer un programme wrappeur dans mon projet MFC (Classe MFCDEVICEDlg).
la classe wrappeur a donc des méthodes sur une couche supérieure à la classe device
et herite donc de la classe device.
Fichiers:
-Le programe wrappeur possède 2 fichiers: device_wrappeur.h et device_wrappeur.cpp
-La librairie device possède plusieurs fichiers .h dont le principal est: device.h (avec des fonctions inline )
-Le porjet MFC contient donc principalement les fichiers : MFCDEVICEDlg.cpp et MFCDEVICEDlg.h
Le concept en soi est donc d'utiliser soit directement la classe device avec ce methodes
mais alors le projet devient plus lourd à réaliser, donc j'ai décidé d'utiliser les appels du programme wrappeur et donc j'ai ajouter à mon projet MFC les 2 classes la mère "device" et la fille "device_wrappeur".
Jusqu'ici vous suivez, donc niveau conception je suppose que la casse device_wrappeur sera un aggregat à ma classe MFCDEVICEDlg et en même temps heritera de la classe device
Pour l'implementation de mon projet MFCDEVICE cj'ai ajouter les include de la classe device_wrappeur et decice (même si la classe device_wrappeur continet deja #include device.h) et je crée simplement une instance de device_wrappeur en globale dans le fichier MFCDEVICEDlg.cpp, (dois je mettre device_wrappeur en tant qu'attribut à ma classe MFCDEVICE?)
Sachant que device_wrappeur utilise ses propres méthodes mais aussi celles de la classe mère device. J'appele donc indirectement dans mon projet MFC, via l'instance de la classe device_wrappeur les methodes de la classe device.
Voici le resumé du code:
code device_wrappeur.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 #include "stdafx.h" //a mettre dans tous les fichiers .cpp si MFC #ifndef DEVICE_WRAPPEUR_INCL #include "device_wrappeur.h" #endif #ifndef DEVICE_INCL #include "device.h" #endif ... bool device_wrappeur::SetupCapture(gxu16 propname, gxu16 propvalue) { gxu16 props[] = { propname, propvalue, FXCAM_CAPTURE_PROPERTY_END }; bool st = device::SetCaptureProperties(props); //classe mere return st; } ....
code device_wrappeur.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
36
37
38
39
40
41
42
43
44
45 #ifndef DEVICE_WRAPPEUR_INCL #define DEVICE_WRAPPEUR_INCL //------------------------------------------------------------------------------ #ifndef DEVICE_INCL #include "device.h" #endif #include "gxdevice.h" #include <stdio.h> class device_wrappeur: public device { protected: // ------- Error handling ------- char error_buffer[512]; char *logfile; ... //protected: public: // en public sinon pas d'acces possible #pragma pack(1) struct DEVICE_WRAPPEUR_SETTINGS { gxu16 version; /**< Version of the structure. */ gxu16 flags; /**< Flags for preview program. */ gxu16 again; /**< Analog gain. */ gxu16 dgain; /**< Digital gain. */ } settings; public: ... virtual bool SetupCapture(gxu16 propname, gxu16 propvalue); // ...
code MFCDEVICEDlg.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 #include "stdafx.h" #include "MFCDEVICE.h" #include "MFCDEVICEDlg.h" #include "afxwin.h" #include "device.h" //dois je retirer car dans device_wrappeur.h j'ai aussi ? #ifndef DEVICE_WRAPPEUR_INCL #include "device_wrappeur.h" // classe dérivée de device #endif .. //GLOBALES device_wrappeur cp; //instance en globale device_wrappeur::DEVICE_WRAPPEUR_SETTINGS settings; //prototype que je mets sinon: "error C2065: 'settings' : undeclared identifier" plus bas enum device_wrappeur::DEVICE_WRAPPEUR_FLAGS DEVICE_WRAPPEUR_FLAG_FILTER; //je mets sinon erreur: "error C2065: 'DEVICE_WRAPPEUR_FLAG_FILTER' : undeclared identifier" plus bas ... //FONCTIONS void MFCDEVICEDlg::OnCheck1() { // TODO: Add your control notification handler code here //FONCTION AGIT CORRECTEMENT, C'EST UNE METHODE DE DEVICE // DONC DE LA CLASSE MERE if(!cp.IsValid()) { device_geterror(&ecode, ebuf, sizeof(ebuf)); fprintf(stderr, "Open module failed: %i %s\n", ecode, ebuf); //return 1; } ... } void MFCDEVICEDlg::OnSelchangeCombo2() { ... //FONCTION QUI N'A PAS D'EFFET PQ? bool need_reconnect = !cp.SetupCapture(DEVICE_CAPTURE_PROPERTY_DGAIN, cp.settings.dgain); //settings etant une struct defini dans device_wrappeur.h //DEVICE_CAPTURE_PROPERTY_DGAIN etant un enum de device definit dans device.h } ...
Sur les methodes device_wrappeur et device , ce qui me surprend c'est que les appels sur les methodes de device fonctionne bien mais celles sur les methodes (de couche supérieur) de device_wrappeur restent neutre, càd que la fonction (SetupCapture) ne fait rien alors que dans le programme en console (device_wrappeur.cpp) il agit correctement pq??
Pourriez vous m'aider car je pense qu'il s'agit d'un probleme de conception ou d'instance nul sur un objet ?
Merci
Partager