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 :

[MFC] - DLL ressource et CDialogBar & Menu


Sujet :

MFC

  1. #1
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut [MFC] - DLL ressource et CDialogBar & Menu
    Re Re Hello,

    Maintenant j'ai un autre soucis.

    Pour les ressources de toutes les boîtes de dialogues de mon application, les ressources se mettent bien à jour par rapport à ma DLL de ressources.

    Dans mon application j'ai un menu et je fais appel à des CDialogBar.
    Pour celles-ci les ressources ne se mettent pas à jour par rapport à la DLL.

    Auriez vous une petite idée ?

    Merci

    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  2. #2
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    argh c'est le coté obscur de l'autre post !
    je vais quand même faire un essai en MDI pour voir lol


  3. #3
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut
    J'ai peut être un début de piste :

    Le menu et les CDialogBar sont créés au moment où l'on effectue un LoadFrame.
    Comme mes boîtes de dialogues ne sont créées que bien après, les ressources ont eu le temps de basculer vers les ressources de la DLL.

    Si l'on réussi à mettre à jour les ressources avant de créer le menu et les CDialog Bar, alors on devrait avoir normalement les ressources dans la langue souhaitée.

    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  4. #4
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut Solution pour la partie Menu de l'application
    Après réflexion, je viens de trouver la solution au problème du menu :
    Il suffit de recharger le menu

    Détails de la solution :

    Chargement de la mainFrame avec LoadFrame
    Chargement de la DLL de ressource adéquate
    Mise à jour des ressources en générale
    Chargement d'une instance de menu avec l'identifiant du menu principal de l'application
    Mise à jour du menu en cours avec un SetMenu de l'instance de menu précédemment chargé

    En code :
    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
     
    ...
    	// create main MDI Frame window
    	CMainFrame* pMainFrame = new CMainFrame;
     
    	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
       {
    		return FALSE;
       }
    	m_pMainWnd = pMainFrame ;
     
       //--------------------------------------------------------------
       // Récupération de la librairie à charger
     
       // impose d'utiliser la dll france
       WriteProfileInt("Language","SetInEs",true);
     
       // récupération de la langue choisie
       m_bFrenchRes=(GetProfileInt("Language","SetInEs",0)==1);
       HINSTANCE dll ;
       if(m_bFrenchRes)
       {
          //--------------------------------------------------------------
          // chargement de la librairie
          dll = LoadLibrary("Pilot3D_Es.dll");
          if(dll) 
          {
             //--------------------------------------------------------------
             //mise à jour des ressources
             AfxSetResourceHandle(dll);
     
             //--------------------------------------------------------------
             // mise à jour du menu
             CMenu menu ;
             menu.LoadMenu(IDR_MAINFRAME) ;
             m_pMainWnd->SetMenu(&menu) ;
          }
       }
    ..
    Et là on obtient un joli menu dans la langue souhaitée !



    Alice

    PS : Peut être que pour les CDialogBars chargées au début de l'application, c'est la même chose .... ?
    Alice

    A coeur vaillant, rien d'impossible !

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    ce qui me derange encore ,c'est pourquoi en MDI tu as eu un probleme sur le chargement de la mainframe quand la DLL etait chargée avant ..

  6. #6
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut
    je ne sais pas .....

    tout ce que je peux te dire c'est que lorsque l'on met à jour les ressources avant de de charger la fenêtre principale : la fonction LoadFrame provoque une erreur et du coup mon application se ferme par un return false....

    Dans les cas suivants, l'application s'arrête après LoadFrame et retourne false :
    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
     
    ...
    //--------------------------------------------------------------
       // Chargement de la librairie adéquate
     
       // impose d'utiliser la dll france
       WriteProfileInt("Language","SetInEs",true);
     
       // récupération de la langue choisie
       m_bFrenchRes=(GetProfileInt("Language","SetInEs",0)==1);
       if(m_bFrenchRes)
       {
          // chargement de la librairie
          HINSTANCE dll = LoadLibrary("Pilot3D_Es.dll");
          if(dll) 
          {
             //mise à jour des ressources
             AfxSetResourceHandle(dll);
          }
       }
       // create main MDI Frame window
       CMainFrame* pMainFrame = new CMainFrame;
     
       if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
       {
    		return FALSE;
       }
    	m_pMainWnd = pMainFrame ;
    ...
    ou

    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
     
    ...
    //--------------------------------------------------------------
       // Chargement de la librairie adéquate
     
       // impose d'utiliser la dll france
       WriteProfileInt("Language","SetInEs",true);
     
       // récupération de la langue choisie
       m_bFrenchRes=(GetProfileInt("Language","SetInEs",0)==1);
     HINSTANCE dll ;
       if(m_bFrenchRes)
       {
          // chargement de la librairie
          dll = LoadLibrary("Pilot3D_Es.dll");
     
       }
       // create main MDI Frame window
       CMainFrame* pMainFrame = new CMainFrame;
     
          if(dll) 
          {
             //mise à jour des ressources
             AfxSetResourceHandle(dll);
          }
     
       if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
       {
    		return FALSE;
       }
    	m_pMainWnd = pMainFrame ;
    ...
    Dans les deux cas suivants, l'application ne se ferme pas :

    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
     
    ...
    	// create main MDI Frame window
    	CMainFrame* pMainFrame = new CMainFrame;
     
    	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
       {
    		return FALSE;
       }
    	m_pMainWnd = pMainFrame ;
     
       //--------------------------------------------------------------
       // Chargement de la librairie adéquate
     
       // impose d'utiliser la dll france
       WriteProfileInt("Language","SetInEs",true);
     
       // récupération de la langue choisie
       m_bFrenchRes=(GetProfileInt("Language","SetInEs",0)==1);
       if(m_bFrenchRes)
       {
          // chargement de la librairie
          HINSTANCE dll = LoadLibrary("Pilot3D_Es.dll");
          if(dll) 
          {
             //mise à jour des ressources
             AfxSetResourceHandle(dll);
          }
       }
    ...
    ou

    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
     
    ...
       //--------------------------------------------------------------
       // Chargement de la librairie adéquate
     
       // impose d'utiliser la dll france
       WriteProfileInt("Language","SetInEs",true);
     
       // récupération de la langue choisie
       m_bFrenchRes=(GetProfileInt("Language","SetInEs",0)==1);
       HINSTANCE dll ;
       if(m_bFrenchRes)
       {
          // chargement de la librairie
          HINSTANCE dll = LoadLibrary("Pilot3D_Es.dll");
       }
    	// create main MDI Frame window
    	CMainFrame* pMainFrame = new CMainFrame;
     
    	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
       {
    		return FALSE;
       }
       if(dll) 
          {
             //mise à jour des ressources
             AfxSetResourceHandle(dll);
          }
     
    	m_pMainWnd = pMainFrame ;
    ...
    J'espère que cela va t'aider dans la compréhension du bug ....

    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  7. #7
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut Suite et Fin
    Bon je confirme pour les CDialogBars, s'était pareil.

    si je les créés une fois que tout est lancé (après le OnCreate de ma mainFrame), il n'y a aucun soucis : les ressources sont mises à jour par rapport aux ressources de la DLL chargées.



    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  8. #8
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    je viens de refaire un essai en transformant mon exemple SDI en MDI ça fonctionne :
    http://farscape.developpez.com/Sampl...tResDllMDI.zip

    peut etre faire un essai de rajouter un dialogbar dans ce projet mais bon je ne vois pas pourquoi ça generait

    t'en penses quoi ?

  9. #9
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut
    A partir de tes lumières, j'ai repris mon application de manière à charger la dll et mettre à jour les ressources avant de lancer LoadFrame.

    Cette fois ci, ça marche à condition que les dialogsBar soient bien générées en dehors du OnCreate de la mainFrame.

    A partir du moment ou j'en met une dans le OnCreate, LoadFrame refuse de fonctionner.

    Cependant j'ai une DialogBar qui contient une grille, sa ressource est strictement identique entre la DLL et le projet d'origine. Mais quand on est avec les ressources de la DLL, il y a un problème de création de la boîte de dialog flottante.

    Sinon toutes mes autres CDialogBar se crééent très bien ainsi que le menu qui se met à jour correctement sans être obligé de le recharger !

    Tu y comprends quelque chose ?


    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  10. #10
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    bon ,je reviens a la charge:
    http://farscape.developpez.com/Sampl...tResDllMDI.zip

    exemple completé avec une barre de dialogue dans la mainframe.
    ça fonctionne.
    par contre j'ai eu des problemes sur la lecture de la DLL de ressources.
    apres sa generation en release je la copie a la racine du projet...


  11. #11
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut
    Hello,

    Je suis tout a fait d'accord mais dans mon application j'ai 7 dialogBar + une barre d'état.
    La barre d'état et 6 boîtes de dialogues sont très bien prises en comptes mais la 7ème ne se créé absolument pas...
    et là cela reste un mystère car il n'y a pas vraiment de différences avec les autres.

    Merci encore pour ton aide.

    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  12. #12
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    pour preciser un peu plus le context:
    tes dialogues barres sont toutes au niveau de la mainframe ?
    essaie aussi de recopier (avec une petite sauvegarde avant )
    le fichier resource.h maitre dans le repertoire de la DLL.


  13. #13
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut
    Pour le fichier ressource, même en recopiant à nouveau le ressource principal dans le répertoire de la DLL : la 7ème boîte ne veut absolumment pas se créer.

    Alors qu'avant, elle se créait très bien !

    Sinon pour le context : toutes mes boîtes de dialogues sont créés à partir de ma MainFrame.

    Je sèche complètement et comme c'est hyper pressé je passe par une autre méthode pour passer mon appli. en multilingue.

    Ceci dit je vais continuer à chercher en parallèle.

    Merci.

    Alice
    Alice

    A coeur vaillant, rien d'impossible !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/03/2008, 19h01
  2. [MFC] DLL avec boite de dialogue
    Par ricky78 dans le forum MFC
    Réponses: 2
    Dernier message: 17/06/2005, 12h06
  3. [MFC][DLL]Dialog Avec ActiveX dans une DLL ?
    Par matazz dans le forum MFC
    Réponses: 1
    Dernier message: 16/05/2005, 16h36
  4. [MFC][DLL]Afficher une CDialog ?
    Par matazz dans le forum MFC
    Réponses: 13
    Dernier message: 13/04/2005, 13h47
  5. [MFC] DLL et notifications d'événements
    Par Kaori dans le forum MFC
    Réponses: 19
    Dernier message: 22/03/2005, 09h33

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