[MFC][résolu] Librairie chargée à la volée avec des contrôles ActiveX

Librairie chargée à la volée avec des contrôles ActiveX [MFC][résolu] - C++ - Programmation

Marsh Posté le 03-11-2006 à 11:45:25    

Bonjour à tous !
 
Me voilà de retour pour un problème que je n'arrive pas à résoudre :
 
J'ai une application qui charge à la volée un librairie qui permet la gestion d'une interface graphique.
Le fait de charger cette librairie à la volée me permet d'avoir plusieurs librairies différentes (avec la même interface pour communiquer avec l'application de base) avec chacune son organisation au niveau IHM.
 
Jusque là tout va bien avec les composant graphique standard (boutons tout bêtes) mais si j'ajoute un ActiveX dans ma bibliothèque graphique, plus rien ne va  :cry: La création de la fenêtre ne se déroule pas comme il faut...
 
Ma procédure pour créer mon projet (sous Visual studio 2005) :
- Création d'une application MFC (testLibMFC).
  diverses options :
  - Baséee sur des boites de dialogue,
  - Standard MFC,
  - DLL partagée,
  - Contrôle ActiveX,
  - Manifeste des contrôle communs,
  (le reste n'est pas coché)
- Ajout d'un bouton à la boite de dialogue créé par défaut.
- Assignation d'une action lors du clic sur ce bouton. (on met en pose le projet principal)
 
- Ajout d'un nouveau projet MFC DLL (maLibMFC) (que je crée dans xxx\testLibMFC\)
  unique option : DLL normale utilisant une DLL MFC partagée.
- Ajout d'un dialogue aux ressources de la librairie (le dialogue par défaut convient très bien)
- Ajout d'un classe associée à ce dialogue (CMonDialogue)
- Dans la méthode CmaLibMFCApp::InitInstance() ajout de la création de la boite de dialogue:

Code :
  1. // ne pas oublier :
  2. #include "MonDialogue.h"
  3. BOOL CmaLibMFCApp::InitInstance()
  4. {
  5. CWinApp::InitInstance();
  6. // Les 3 lignes suivantes sont ajoutées.
  7. CMonDialogue* dlg = new CMonDialogue();
  8. dlg->Create(IDD_DIALOG1);
  9. dlg->ShowWindow(1);
  10. return TRUE;
  11. }


 
- Retour dans le projet testLibMFC pour affecter une action au bouton qui a été précédemment ajouté :

Code :
  1. void CtestLibMFCDlg::OnBnClickedButton1()
  2. {
  3. HINSTANCE accesLibrairie = AfxLoadLibrary( "maLibMFC.dll" );
  4. if( !accesLibrairie )
  5.  MessageBox( "Problème d'initialisation de la librairie" );
  6. }


 
- Après compilation, il suffit de cliquer sur le bouton qui a été ajouté pour charger la librairie et afficher la fenêtre de dialogue. (cela ne marche qu'une seule fois car un fois chargée la librairie n'est plus rechargée, elle n'est donc pas initialisée de nouveau).
 
Maintenant si on ajoute un contrôle ActiveX à notre fenêtre de dialogue créée au niveau de la librairie plus rien ne fonctionne :
- Ajout d'un composant ActiveX à notre fenêtre IDD_DIALOG1 (par exemple un "Microsoft Tabbed Dialog Control 6.0" que tout le monde devrait avoir)
- Ajout d'une variable associée à cet élément (monTab) (Rq: Visual crée automatiquement une classe CSstab1 d'encapsulation pour accéder correctement à l'activeX)
 
- Maintenant après recompilation et clic sur le bouton de la fenêtre principale (en mode Debug) on a un beau problème sur un ASSERT qui vient du fait que m_hWnd est nul lors de l'appel à ShowWindow (winocc.cpp).
Quand on y regarde de plus près, il y a bien un problème au niveau de la création (dlg->Create(IDD_DIALOG1)) mais l'appel à GetLastError() renvoi toujours 0 (pas d'erreur...)
 
Voilà je suis donc un peu perdu à ce niveau et votre aide me serait d'un grand secour :)
 
Remarque : si on ajoute ce composant ActiveX dans la fenêtre principale de l'application il s'affiche correctement...


Message édité par bb138 le 03-11-2006 à 13:45:11
Reply

Marsh Posté le 03-11-2006 à 11:45:25   

Reply

Marsh Posté le 03-11-2006 à 13:44:37    

Merci pour ceux qui se sont penchés sur mon problème :)
 
La solution est toute simple, il suffit d'ajouter un AfxEnableControlContainer() avant l'utilisation d'ActiveX (oui c'est tout bête mais je ne m'y connais pas encore trop en MFC et ses subtilités...)
Je suis content d'avoir trouvé la solution même si j'ai vraiment galéré...
 
Voilà le nouvel InitInstance :

Code :
  1. BOOL CmaLibMFCApp::InitInstance()
  2. {
  3. CWinApp::InitInstance();
  4. AfxEnableControlContainer();
  5. CMonDialogue* dlg = new CMonDialogue();
  6. dlg->Create(IDD_DIALOG1);
  7. dlg->ShowWindow(1);
  8. return TRUE;
  9. }


 
A la prochaine !
 
PS : Pour ceux qui rencontrent des soucis et tombent sur mon post voici quelques liens :
http://www.developpez.net/forums/s [...] ctivex+dll
http://www.codeguru.com/Cpp/W-P/dll/article.php/c101/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed