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