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

  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 ?

  7. #7
    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
    bon j'ai fait l'exemple suivant:
    dans ma dll d'extension j'ai d�clar� une dialogue.
    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
     
    static HINSTANCE hInstDll;
     
    extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
        // Remove this if you use lpReserved
        UNREFERENCED_PARAMETER(lpReserved);
     
        hInstDll=hInstance;
        if (dwReason == DLL_PROCESS_ATTACH)
        {
            TRACE0("TESTDLL.DLL Initializing!\n");
     
            // Extension DLL one-time initialization
            if (!AfxInitExtensionModule(TestDllDLL, hInstance))
                return 0;
     
            // Insert this DLL into the resource chain
            // NOTE: If this Extension DLL is being implicitly linked to by
            //  an MFC Regular DLL (such as an ActiveX Control)
            //  instead of an MFC application, then you will want to
            //  remove this line from DllMain and put it in a separate
            //  function exported from this Extension DLL.  The Regular DLL
            //  that uses this Extension DLL should then explicitly call that
            //  function to initialize this Extension DLL.  Otherwise,
            //  the CDynLinkLibrary object will not be attached to the
            //  Regular DLL's resource chain, and serious problems will
            //  result.
     
            new CDynLinkLibrary(TestDllDLL);
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
            TRACE0("TESTDLL.DLL Terminating!\n");
            // Terminate the library before destructors are called
            AfxTermExtensionModule(TestDllDLL);
        }
        return 1;   // ok
    }
    extern "C" AFX_EXT_API void AffDlg(HINSTANCE hInst)
    {
        HINSTANCE savhInst=hInst;
     
        AfxSetResourceHandle(hInstDll);
     
        MyDialog Dlg;
        Dlg.DoModal();
        AfxSetResourceHandle(savhInst);
    }
    et une fonction pour appeler cette dialogue de l'ext�rieur..
    cette fonction recoit l'instance de l'application principale
    fixe les ressources sur la dll
    appel la dialogue.
    restitue les ressources sur l'application principale
    cot� applicatif:
    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
     
    void CTestmainDlg::OnButton() 
    {
        // TODO: Add your control notification handler code here
        HINSTANCE hDLL = LoadLibrary("c:/samples/Vol1/testDll/Debug/testdll.dll");
        if((unsigned int)hDLL<0x20)
        {
            TRACE(_T("\nDLL non trouvée ou Erreur consultez GetLastError() !!!"));
            return ;    
        }
     
        typedef void ( * LPDLLFUNC)(HINSTANCE);
        LPDLLFUNC lpfnDllFunc = NULL;
        lpfnDllFunc = (LPDLLFUNC)::GetProcAddress(hDLL,_T("AffDlg"));
        if (!lpfnDllFunc)
        {
            FreeLibrary(hDLL);
            return;
        }
        lpfnDllFunc(AfxGetResourceHandle());
     
        FreeLibrary(hDLL);
    }
    je lis ma dll,
    je r�cup�re l'adresse de ma fonction et je passe l'instance de l'application.
    �a fonctionne tr�s bien..
    quelque soit l'endroit ou est fait l'appel le principe reste le m�me : il faut switcher les ressources entre la dll et le programme principale...

  8. #8
    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 pour tes r�ponses.

    Je viens de recr�er un projet de d�mo (comme tu l'as fait) et effectivement, �a marche tr�s bien. Par contre, appliqu� dans le projet sur lequel je travaille, cela ne marche toujours pas, m�me si le changement de resource s'effectue bien (v�rifi� par des appels successifs � AfxGetResourceHandle).
    C'est encore sur le DoModal que claque l'assert.
    Je ne marque pas encore le topic comme r�solu ; je cherche � corriger mon erreur d'abord.

    Cordialement,
    Aymerik

  9. #9
    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
    le probl�me vient peut �tre de ta dialogue par exemple un probl�me sur un contr�le.
    si tu utilises la dll en debug tu peux la debuger .
    Ensuite place des points d'arr�ts dans DoDataExchange et OnInitDialog.
    et trace pas a pas.

  10. #10
    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
    Je ne pense pas que cela vienne de la Dialog : je passe bien dans le constructeur, mais pas dans le OnInitDialog.
    J'ai fait le test avec une nouvelle dialog "vide", mais l'assert est le m�me.
    voici la call stack au moment de l'assert:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    AfxGetInstanceHandle() line 19 + 33 bytes
    AfxEndDeferRegisterClass(long 0x00000010) line 3633 + 5 bytes
    CWnd::CreateDlgIndirect(const DLGTEMPLATE * 0x0211d528, CWnd * 0x00000000 {CWnd hWnd=???}, HINSTANCE__ * 0x02100000) line 277 + 7 bytes
    CDialog::DoModal() line 528 + 32 bytes
    TestDlg(HINSTANCE__ * 0x00400000) line 58 // Méthode externe de ma DLL
    me renvoyant � ce code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    _AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()
    	{ ASSERT(afxCurrentInstanceHandle != NULL);
    		return afxCurrentInstanceHandle; }
    L'assert pr�sent� claque : ce qui me fait plus penser au probl�me de ressource �voqu� pr�c�dement qu'autre chose...

  11. #11
    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
    attention que le handle d'instance de l'application doit �tre demand� a partir du programme principal pas dans la DLL.
    ce qui correspond a cette ligne dans mon exemple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
     lpnDllFunc(AfxGetResourceHandle());
    celui de la dll peut �tre sauvegard� dans DllMain

  12. #12
    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
    Mais je fais tout pareil que toi !

  13. #13
    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
    h� bien �a ne doit pas �tre tout a fait pareil
    fait afficher avec des traces (TRACE) la valeurs des handles d'instance (avec %X):
    - dans le programme principal :
    le handle de l'application.
    celui de la dll lue.

    - dans la dll au moment de la demande d'affichage de la dialogue:
    celui de l'application que tu dois avoir r�cup�r�.
    celui de la DLL.

    compare les valeurs ,c'est pareil ?

  14. #14
    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
    Bon d'accord, �a ne doit pas �tre tout � fait pareil !
    J'avance petit � petit :
    - j'ai pris ma classe d�crivant ma dialog et je l'ai copi�e dans mon projet de test : elle s'affiche correctement ; elle n'est donc pas en cause ;
    - j'ai trac� les adresses des instances comme tu me l'as sugg�r�, et elles correspondent entre l'application et la DLL (tout en �tant non nulles bien s�r !)

    je continue � creuser...

    edit : je pr�cise le "elles correspondent" :l'adresse de l'instance de l'application a la m�me valeur hVal1 depuis l'appli et depuis la DLL ; l'adresse de l'instance de la DLL a la m�me valeur hVal2 depuis l'appli et depuis la DLL.

  15. #15
    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
    Je progresse mais arrive en face d'un mur ...
    Le probl�me ne vient pas de la DLL, mais de l'application. En effet, pour tester cela, j'ai compil� ma DLL depuis mon workspace de travail, et l'ai charg� depuis mon application de test (cr��e pour l'occasion). Cela fonctionne tr�s bien.
    Je me suis rendu compte que le probl�me vient plus pr�cisement des options de compilations. Mais l�, je me perd
    - Mon appli utilise les MFC en statique, ainsi que des DLL MFC statiques.
    - j'essaie de charger des DLL MFC dynamiques

    Citation Envoy� par msdn
    Caution Do not mix static and dynamic versions of the run-time libraries. Having more than one copy of the run-time libraries in a process can cause problems, because static data in one copy is not shared with the other copy. The linker prevents you from linking with both static and dynamic versions within one .exe file, but you can still end up with two (or more) copies of the run-time libraries. For example, a dynamic-link library linked with the static (non-DLL) versions of the run-time libraries can cause problems when used with an .exe file that was linked with the dynamic (DLL) version of the run-time libraries. (You should also avoid mixing the debug and non-debug versions of the libraries in one process.)
    Donc j'ai fait fausse route avec ces DLL d'extension MFC

    Je repars vers des DLL statiques.
    En tous cas, merci beaucoup Farscape

  16. #16
    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,
    En effet les dll d'extensions imposent de travailler en dll MFC partag�es...

+ 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