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 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 :
- // ne pas oublier :
- #include "MonDialogue.h"
- BOOL CmaLibMFCApp::InitInstance()
- {
- CWinApp::InitInstance();
- // Les 3 lignes suivantes sont ajoutées.
- CMonDialogue* dlg = new CMonDialogue();
- dlg->Create(IDD_DIALOG1);
- dlg->ShowWindow(1);
- return TRUE;
- }
|
- Retour dans le projet testLibMFC pour affecter une action au bouton qui a été précédemment ajouté :
Code :
- void CtestLibMFCDlg::OnBnClickedButton1()
- {
- HINSTANCE accesLibrairie = AfxLoadLibrary( "maLibMFC.dll" );
- if( !accesLibrairie )
- MessageBox( "Problème d'initialisation de la librairie" );
- }
|
- 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