Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1468 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1469839
bb138
La vie est belle ...
Posté le 03-11-2006 à 11:45:25  profilanswer
 

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
mood
Publicité
Posté le 03-11-2006 à 11:45:25  profilanswer
 

n°1469959
bb138
La vie est belle ...
Posté le 03-11-2006 à 13:44:37  profilanswer
 

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/


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Résolu] Question Poo en delphi[résolu] Hook win32 voulu global...
[resolu] Pas fait pour les ordis portables les menus déroulants ?![Résolu]Générer xhtml avec xsl sous ie
Valider un xml avec Xerces et lister toutes les erreurs[résolu]Erreur .php -> Résolu
[RESOLU][Access] Authentification automatique tables liées[Résolu] MySQL - pb insertion num téléphone
[RESOLU][SQL] Pb de requete vide[Résolu] Afficher une image 'aperçu' de la vidéo
Plus de sujets relatifs à : [MFC][résolu] Librairie chargée à la volée avec des contrôles ActiveX


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR