IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Dll d'extension MFC et CDialog


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut Dll d'extension MFC et CDialog
    Bonjour à tous.

    Je suis chargé d'isoler la couche de communication d'un logiciel dans une DLL. J'isole donc dans une DLL le bus et le protocole.
    En consultant les tutoriels, j'ai remarqué celui de Farscape : "DLL d'extensions : écriture d'un plug-in de classe". L'avantage de cette méthode est d'utiliser la classe de la DLL comme si elle faisait partie du projet (si j'ai bien tout compris, je suis novice en DLL...)
    J'ai donc mis cela en œuvre, ce qui marche très bien jusqu'au moment où j'ai voulu ajouter une boite de dialogue dans la DLL pour la configuration. Et là... Assert dans le code MFC lorsque je tente de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CMyDlg dlg;
    dlg.DoModal();
    Après une petite recherche, pour utiliser une boite de dialogue dans une DLL, il faut faire précéder son utilisation par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    Mais là, le linker n'en veut pas : symboles déjà définis DllMain... (je n'ai plus les messages exacts en tête).
    Alors est-ce que je fait fausse route en utilisant ce type de DLL (extension MFC) ? Faut il que je repasse au type Shared MFC DLL ?
    J'avoue que je suis un peu perdu ; merci par avance de vos explications et conseils !

    edit : je ne pense pas que ça ait une grande influence, mais ce projet est sous VC++98

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Typiquement, mon problème est celui décrit dans cette TN : DOC: AfxGetStaticModuleState() Causes Errors in an Extension DLL ; mais ça ne me dit toujours pas comment ouvrir ma Dlg dans ma DLL...

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    essaye:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AFX_MANAGE_STATE(AfxGetAppModuleState());

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Salut Farscape,
    merci de ta réponse, ça ne passe pas non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AFX_MANAGE_STATE(AfxGetAppModuleState());
    CMyDlg dlg;
    dlg.DoModal();
    La dialogue que j'instancie localement semble valide dans le débugger, mais a un hWnd à 0.
    J'ai testé l'autre solution au cas où...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AFX_MANAGE_STATE(AfxGetAppModuleState());
    CMyDlg* pDlg = new CMyDlg();
    pDlg->DoModal();
    Pas mieux.
    On est bien d'accord que dans la théorie, il est possible d'ajouter des boites de dialogues depuis une DLL d'extension MFC ?

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    oui, en fait il faut switcher les ressources entre la dll et le programme avec AfxSetResourceHandle un peu comme dans ce post :
    http://cpp.developpez.com/faq/vc/?pa...gMultiLanguage
    il faut que tu fasses une fonction dans ta dll qui renvoie son handle de ressource avec AfxGetResourceHandle.
    et tu alternes de l'un a l'autre ..
    tu peux peux faire un objet qui lorsqu'il est initialisé change le contexte.
    et quand il se détruit remet celui du programme.

    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
     
    class SwitchResourceDll
    {
    public:
        SwitchResourceDll(HINSTANCE hInstDll)
        {
            m_hInst = AfxGetResourceHandle();// sauvegarde le contexte.
            AfxSetResourceHandle(hInstDll);
        }
     
        ~SwitchResourceDll()    // restauration du contexte.
        {
            AfxSetResourceHandle(m_hInst);
        }
     
    private:
        HINSTANCE m_hInst;
    };
    extern "C" HINSTANCE GetDllInstance();
     
    {
      SwitchResourceDll SwitchDll(GetDllInstance());
      CMyDlg dlg;
      dlg.DoModal();
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Merci Farscape de tes réponses.
    Mais j'ai un peu de mal à comprendre ton exemple. Visiblement, l'instance de SwitchResourceDll est utilisée au sein de la DLL, à l'endroit précis où j'ai besoin d'effectuer le changement de resources. Mais dans ce cas, si le changement s'effectue depuis la DLL, pourquoi mettre la méthode GetDllInstance() externe ?
    Pour être honnête, je ne voie pas très bien pourquoi l'on ne fait pas simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HINSTANCE hExeInst = AfxGetResourceHandle(); // sauvegarde
    HINSTANCE hDllInst = AfxGetInstanceHandle();
    AfxSetResourceHandle(hDllInst); // mise à jour
     
    UartConfigDlg confDlg;
    confDlg.DoModal();
     
    AfxSetResourceHandle(hExeInst);// restauration
    Mis à part l'assert à l'exécution ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/08/2009, 17h17
  2. Réponses: 1
    Dernier message: 31/01/2008, 16h55
  3. DLL d'extension
    Par PRUVOT dans le forum MFC
    Réponses: 1
    Dernier message: 26/10/2005, 15h41
  4. [MFC] Variable global et DLL d'extension
    Par Capnader dans le forum MFC
    Réponses: 2
    Dernier message: 31/03/2005, 11h33
  5. Réponses: 9
    Dernier message: 03/12/2004, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo