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] - MDI : CDialogBar, fonctionne en DEBUG pas en RELEASE


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] - MDI : CDialogBar, fonctionne en DEBUG pas en RELEASE
    Bonjour,


    j'ai une application MDI dans laquelle j'ai mis des CDialogBar.

    En mode debug, quand je fais un showControlBar d'une de ces boîtes, cette boîte apparait ou disparait correctement.

    En mode release, quand je veux faire disparaitre une de ces boîtes avec un ShowControlBar, pas de problème.
    Mais quand je veux faire apparaître une de ces boîtes avec un ShowControlBar , l'ordi me répond que cette action engendre un problème mémoire.

    Auriez vous une idée du problème ?



    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    salut,

    j'ai récemment appris, à mes dépends, qu'en mode debug, le compilo initialise les variables à 0 (==NULL). Alors qu'en mode release, il n'en fait rien et du coup, ça peut engendrer des problèmes de pointeur. Vérifie donc l'initialisation de ta CDialogBar.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    pb typique de debordement memoire ou de mauvaise initialisation de pointeur.
    note pour r0d:
    les variables ne sont pas initialisées en DEBUG:
    une variable declarée non initialisée prend la valeur :0xcdcdcdcd ou 0xCCCCCCCC


  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 re
    pour eviter ce problème je réinitialise à null le pointeur sur ma futur boîte de dialog (avant sa création)

    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
    m_dlgBar_Gamme = NULL ;
    m_dlgBar_Saisie = new CDlgBar_Saisie ;
     
    m_dlgBar_Saisie->m_pMainFrame=this; 
     
    if (!m_dlgBar_Saisie->Create(
    				pilot3D_listType,
    				pilot3D_listRef,
    				pilot3D_dataDir,
    				this, IDD_DLGBAR_SAISIE,
    				CBRS_TOP | CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY,
    				IDD_DLGBAR_SAISIE))
    {
    	writeInLog("---> Création de la boîte de dialogue flottante Saisie :") 
    	writeInLog(" impossible de créer cette boîte\n") ;
    	return -1;		// fail to create
    }
    // caractéristiques : se colle sur tous les bords de la fenêtre
    m_dlgBar_Saisie->EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(m_dlgBar_Saisie);
    ShowControlBar(m_dlgBar_Saisie,FALSE,FALSE);  // on la désactive
    et quand je veux la faire apparaître :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (m_dlgBar_Saisie->IsWindowVisible() != TRUE)
    	{
    		ShowControlBar(m_dlgBar_Saisie,TRUE,FALSE); 
    	}
    	else ShowControlBar(m_dlgBar_Saisie,FALSE,FALSE);
    -> tous les membres de la classe CDlgBar_Saisie sont eux aussi initialisés.

    d'où mon interrogation : où y a t il une erreur qui puisse engendrer un tel débordement ? (sachant que le problème apparait à partir du moment où l'on souhaite visualiser la boîte)
    Alice

    A coeur vaillant, rien d'impossible !

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par farscape
    une variable declarée non initialisée prend la valeur :0xcdcdcdcd ou 0xCCCCCCCC
    exact...
    [désolé]
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowControlBar(m_dlgBar_Saisie,TRUE,FALSE);
    as-tu vérifié la valeur du pointeur m_dlgBar_Saisie à ce niveau du programme (en debug)?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  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
    en mode debug :

    au début mon pointeur contient : 0x000000
    puis après le new : 0x00452730
    après le OnCreate de ma boîte : 0x00452730
    et à la ligne contenant la commande maudite : 0x00452730

    -> a priori il pointe correctement en mémoire.


    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
    essaye de rajouter avant l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ASSERT(::IsWindow(mypdlgbar-> GetSafeHwnd()));
    ou mypdlgbar est ta dialoguebar.

  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
    Avec cette ligne à la place de la cmde ShowControlBar, pas de problème que se soit en debug ou en relise
    Avec la cmde ShowControlBar + cette ligne de code juste avant ou non , quand je demande voir la boîte voici les 2 messages successifs d'insultes :

    l'instrucion à "0x0012fc86" emploie l'adresse mémoire "0x00000001". La mémoire ne peut pas être "read"
    cliquez sur ok pour terminer le programme
    Cliquez sur annuler pour déboguer le programme
    puis

    l'instruction à "0x73d211c7" emploie l'adresse mémoire "0x00000004". La mémoire ne peut pas être "read".
    cliquez sur ok pour terminer le programme
    Je pencherai aussi pour un pointeur fou dans l'appli au niveau de ces boîtes mais pour l'instant je n'ai pas de pistes valides .....



    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  10. #10
    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 réalisé un nouveau test en ne mettant pas la cmde ShowControlBar de manière ce que ma boîte soit directement visible :

    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
    m_dlgBar_Gamme = NULL ;
    m_dlgBar_Saisie = new CDlgBar_Saisie ;
     
    m_dlgBar_Saisie->m_pMainFrame=this;
     
    if (!m_dlgBar_Saisie->Create(
                pilot3D_listType,
                pilot3D_listRef,
                pilot3D_dataDir,
                this, IDD_DLGBAR_SAISIE,
                CBRS_TOP | CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY,
                IDD_DLGBAR_SAISIE))
    {
       writeInLog("---> Création de la boîte de dialogue flottante Saisie :")
       writeInLog(" impossible de créer cette boîte\n") ;
       return -1;      // fail to create
    }
    // caractéristiques : se colle sur tous les bords de la fenêtre
    m_dlgBar_Saisie->EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(m_dlgBar_Saisie);
    Dans ce cas, cela plante direct au niveau de la mémoire. En essayant d'en savoir d'avantage je me suis aperçue que c'est la fonction CDialogBar::Create qui plante l'appli en mode release.... ci dessous le code de la fonction Create de la boîte CDialogBar_Saisie :

    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
    BOOL CDlgBar_Saisie::Create(CString _listType,	// nom du fichier de la liste des types
    							CString _listRef,	// nom du fichier de la liste des référénces du type X
    							CString _dataDir,	// répertoire des donnéées fixes
    							CWnd* pParent, UINT nIDTemplate, UINT nStyle, UINT nID) 
    // création de la boîte de dialogue Saisie
    {
    	// création de la boîte CDialogBar
    	writeInLog("\n---------------------------------\n\n") ;
    	writeInLog("           OUVERTURE Boîte DlgBar Saisie\n\n") ;
     
    	BOOL bReturn = CDialogBar::Create(pParent, nIDTemplate, nStyle, nID);
    	writeInLog("---> Création de la boîte de dialogue flottante Saisie :") ;
    	writeInLog("\n---------------------------------\n\n") ;
    	// retourne si la boîte à bien été créée ou non
    	return bReturn;
    }
    perso je deviens un peu en recherchant ce bug donc toute nouvelle idée est bienvenue !!!



    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    comme ça je ne vois rien qui me choque:
    essaye de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    BOOL CDlgBar_Saisie::Create(CString _listType,   // nom du fichier de la liste des types
                         CString _listRef,   // nom du fichier de la liste des référénces du type X
                         CString _dataDir,   // répertoire des donnéées fixes
                         CWnd* pParent, UINT nIDTemplate, UINT nStyle, UINT nID)
    // création de la boîte de dialogue Saisie
    {
       // création de la boîte CDialogBar
        AfxMessageBox("step1");
       BOOL bReturn = CDialogBar::Create(pParent, nIDTemplate, nStyle, nID);
        AfxMessageBox("step2");
       // retourne si la boîte à bien été créée ou non
       return bReturn;
    }
    ça plante ou exactement apres "step1" ou "step2".

  12. #12
    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 exactement ,on a l'impression que ça plante dans la fonction Create.

    du coup ce matin je reprends tout tranquillement : je refais l'appli depuis le début sans aller trop vite histoire de comprendre ce qui ne va pas.
    -> hier soir sur 3 boîtes de dialogue , j'en avais 1 qui fonctionnai correctement sous release et pas les 2autres alors qu'en comparant les sources il n'y avait ps de différence.

    donc je te tiens au courant dès que j'en sais un peu plus



    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  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
    ça y est : :trouve: que ce soit en mode debug ou release tout fonctionne correctement !!!!

    Pour cela, je ne parle plus de pointeur sur des boîtes de dialogues mais simplement d'instances et surtout le plus important :

    Lors de la création d'une boîte de type CDialogBar (voir ), il faut transformer la fonction Create en ajoutant explicitement l'appel à la fonction OnInitDialog qui contient :
    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
    BOOL CDlgBar_Saisie::OnInitDialog() 
    {
    	UpdateData(FALSE) ;
    	// TODO: Add extra initialization here
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
     
    BOOL CDlgBar_Saisie::Create(CWnd* pParent, UINT nIDTemplate, UINT nStyle, UINT nID) 
    // création de la boîte de dialogue Saisie
    {
    	// création de la boîte CDialogBar
     
    	BOOL bReturn = CDialogBar::Create(pParent, nIDTemplate, nStyle, nID);
    	if(bReturn != false)
    	{
    		if(!OnInitDialog())		
    		{
    			return FALSE;	
    		}
    	}
     
    	// retourne si la boîte à bien été créée ou non
    	return bReturn;
    }
    La fonction OnInitDialog n'est pas à implémenter dans le MESSAGE MAP !!!
    Deplus la fonction Create doit être transformée dans le header car ce n'est plus une fonction virtuelle mais public.

    d'autres part il faut faire super gaffe sur la manière de gérer les évènements de la boîte. Je m'explique :
    Après avoirs implémenter de manière traditionnelle les fonctions liées à des évènements (comme dans une CDialog). Il faut rajouter les fonctions OnUpdateTypeDuControl.
    Pour les comboBox et les boutons, rajouter à la main la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	ON_UPDATE_COMMAND_UI(IDC_CB_TYPE, OnUpdateCbType)
    ainsi que la fonction OnUpdateXXX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CDlgBar_Saisie::OnUpdateCbType(CCmdUI *pCmdUI) 
    // obligatoire dans une boîte flottante pour prendre en compte les évènements
    {
    	// TODO: Add your control notification handler code here
     
    }
    De plus il est à noter que cette fonction est à intégrer dans la Classe comme une simple fonction protégée et non comme une fonction de type afx_msg !!
    Pour les boîtes d'édition (CEdit), rajouter la fonction liée à l'évènement EN_UPDATE (voir AppWizard). De cette manière vous obtiendrez le message suivant dans le MESSAGE_MAP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_EN_UPDATE(IDC_ED_MSN, OnUpdateEdMsn)
    Dans ce cas la fonction OnUpdateXXX est générée automatiquement mais ne lui rajoutez pas de paramètres !!

    Bien entendu n'oubliez pas de déclarer et de créer dans le programme principale la boîte désirée (voir ).

    De cette manière l'application se lance et plus aucun bug mémoire n'apparait (mode Debug ou Release) quand on active ou non les boîtes flottantes !!!

    Encore un grand à Farscape et à r0d pour leurs idées !!!

    Alice

    Alice

    A coeur vaillant, rien d'impossible !

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 29/05/2009, 09h41
  2. Code fonctionne en debug pas en execution
    Par LePhasme dans le forum VBA Word
    Réponses: 5
    Dernier message: 15/05/2008, 10h51
  3. Réponses: 9
    Dernier message: 16/05/2005, 17h43
  4. [MFC] - MDI : CDialogBar resize....
    Par Alice9 dans le forum MFC
    Réponses: 5
    Dernier message: 18/02/2005, 17h12
  5. Réponses: 12
    Dernier message: 02/02/2005, 16h52

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