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 :

Probleme pour modifier des CONTROLs en Release


Sujet :

MFC

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut Probleme pour modifier des CONTROLs en Release
    Bonjour,

    En mode release, j'ai un plantage de l'application (1 fois sur 2) que je ne retrouve pas en mode debug (apparemment)!

    J'ai tâché de me rapprocher par dichotomie au plus près de l'erreur et apparemment elle se situerait au niveau de la ligne de code en gras.
    Voici le code de la fonction qui plante:
    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
    bool X::TraiterEtape5()
    {
    	bool ret = false;
    
    	//Affichage de la procédure
    	ChargerFicProcedure();
    
    	//On fournit le HANDLE de la fenêtre pour l'échange de message
    	CManipDlg *manipDlg = reinterpret_cast<CManipDlg *>(m_apDlg);
    	manipDlg->InitManip(m_hWnd, m_Step);
    	
    //	TraiterEtape5_1(manipDlg);
    //	TraiterEtape5_2(manipDlg);
    	
    	manipDlg->SetDlgItemText(IDC_STATIC_ETAT_OP,"Résultat de la VBF");
    
    	GetDlgItem(IDC_BUTTON_SUIV)->EnableWindow(TRUE);
    	GetDlgItem(IDC_BUTTON_GO)->ShowWindow(FALSE);
    			
    	m_ButtonSuiv.SetTextColor(RGB(0,150,0));
    	::SetEvent(m_hEventBlink);
    	m_nTimer = SetTimer(2, 600, NULL);
    
    	ret = true;
    
    	return ret;
    }
    Je fournis aussi le code de la fonction InitManip():
    void CManipDlg::InitManip(HWND hWnd, UINT step)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    	g_hWndMain = hWnd; 	 //variable statique -> globale à la classe
    	g_nStep = step;		//variable statique -> globale à la classe
    }
    où la classe CManipDlg, dérivée de CDialog, est chargée dynamiquement par la classe CXDlg.
    J'ai été aussi obligé d'utiliser des variables statiques pour la classe CManipDlg car sur l'action d'un control, mes variables n'étaient pas initialisées aux valeurs passées via la fonction InitManip();
    Je pense que mon problème vient de là mais je ne sais pas comment y remédier...Il me faudrait surement récupérer correctement le handle de la fenêtre fille...

    D'après le debbugger, j'ai le message suivant:
    Exception non gérée à 0x5f4365c6 (MFC42D.DLL) dans X.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000020.
    et la variable locale this à NULL(this 0x00000000 {CWnd hWnd=???} CWnd * const)
    L'erreur se situe dans WINNOC.cpp à la ligne suivante:
    ASSERT(::IsWindow(m_hWnd));
    ...Arf!!!

    Nicolas

  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
    salut,
    je dirai que le test de la valeur de manipDlg s'impose, 0x20 c'est blanc en ascii, ta valeur n'est pas du tout valide..

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par farscape
    je dirai que le test de la valeur de manipDlg s'impose, 0x20 c'est blanc en ascii, ta valeur n'est pas du tout valide..
    C'est clair!

    En fait, le problème venait du fait que je faisais un PostMessage() au lieu d'un SendMessage()...Donc selon si le message était traité avant ou après, mon pointeur sur CDialog était initialisé ou non...

    Bon we
    Nicolas

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    J'ai l'impression que c'est incroyablement compliqué pour peu de choses..
    >>
    CManipDlg *manipDlg = reinterpret_cast<CManipDlg *>(m_apDlg);
    est-ce que les variables manipDlg ,m_apDlg sont bien initialisées c.ad. !=NULL ?
    Reprenons depuis le début que veux-tu faire ? Afficher une fenêtre dialogue modale , non modale ?

  5. #5
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Mat.M
    J'ai l'impression que c'est incroyablement compliqué pour peu de choses..
    >>
    CManipDlg *manipDlg = reinterpret_cast<CManipDlg *>(m_apDlg);
    est-ce que les variables manipDlg ,m_apDlg sont bien initialisées c.ad. !=NULL ?
    Reprenons depuis le début que veux-tu faire ? Afficher une fenêtre dialogue modale , non modale ?
    En fait, c'est résolu le problème, comme je disais dans mon post précédent, c'était un probleme au niveau de l'envoie d'un message pour le chargement d'une fenêtre fille dynamiquement. Vu que j'utilsais PostMessage(), m_apDlg n'était pas forcément initialisée au moment ou je l'utilisais. Avec SendMessage(), plus de soucis d'initialisation de mon pointeur sur CDialog puisque le message est forcément traité avant de passer à la suite de l'application.

    Nicolas

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/03/2015, 14h00
  2. Réponses: 1
    Dernier message: 20/08/2009, 12h12
  3. Réponses: 7
    Dernier message: 16/04/2005, 08h55
  4. [NetBeans 4.0 Beta 2]Probleme pour monter des jars
    Par nicoo dans le forum NetBeans
    Réponses: 2
    Dernier message: 19/11/2004, 14h14
  5. Réponses: 5
    Dernier message: 07/07/2004, 16h05

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