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] VC++6 PostQuitMessage


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut [MFC] VC++6 PostQuitMessage
    Bonjour,
    Pour terminer une application j'utilise l'instruction PostQuitMessage(0).
    J'obtiens en mode Release le signalement d'anomalie suivant:
    L'instruction à 0x73d211c7 emploie l'adresse mémoire 0x00000004. La mémoire ne peut pas être Read.
    En mode Debug je n'ai pas cette anomalie.
    Dans les deux cas l'application s'est ensuite teminée.
    Etant amateur en Informatique je souhaiterais que quelq'un puisse m'indiquer une méthode me permettant de trouver l'origine de l'anomalie en mode Release et de la corriger.
    Comme tout paraît bien marcher en mode Debug je ne peux pas mettre de point d'arrêt sur PosQuitMessage et travailler en pas à pas.
    A l'avance , merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ça ressemble à une tentative d'accès au second membre d'une structure, via un pointeur NULL...

    Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct s { int a; int b};
     
    struct s * p=NULL;
     
    /* Beaucoup plus loin, au moment où tu t'y attends le moins: */
     
    int toto = p->b;
    Essaie de voir si tu peux reproduire l'erreur en mode Release+Infos de débogage (mais toujours avec les optimisations). Exécute le programme dans le debugger, et lors du plantage, tu auras la position de l'erreur...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Merci à Medinoc.
    J'ai recompilé en mode Release + infos debug et lancé le programme dans le debuggeur.
    J'obtiens une fenêtre d'anomalie qui me dit que c'est une unhandled exception..................(MFC42.DLL) 0xC0000005 Acces violation.
    Puis je peux voir dans la fenêtre de débogage l'adresse à laquelle ça plante et la ligne asm correspondante :
    0x73d11c7 mov esi,dword ptr (ecx+4)

    Que puis-je en conclure ?
    Que ça se passe dans la DLL et que c'est un problème de handle absent ou à zéro ....
    Ce qui ne m'avance pas beaucoup !
    Je n'utilise pas de structure mais les pointeurs ne manquent pas dans mon appli.
    Je vais chercher et encore chercher .... pour le moment je ne vois pas.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Affiche la fenêtre "call stack", tu devrais pouvoir tracer jusqu'à la fonction à toi qui foire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Medinoc, je vais abuser de ta gentillesse.

    J'ai affiché la pile des appels au moment ou l'erreur survient.
    Je m'aperçois que ce n'est pas PostQuitMessage qui est en cause car je ne vois pas son appel dans la pile.
    On dirait que c'est le "système MFC" qui provoque l'erreur...

    Peut-être que ce que je te joins ci-après te diras quelque chose ?



    /****************************************
    Code qui doit provoquer la fin de l'appli après nettoyage
    ****************************************/

    void CCdeNumFraisView::OnDestroy()
    {
    CView::OnDestroy();

    _fcloseall();
    if (m_hCom) CloseHandle(m_hCom);
    Pen.Detach();DeleteObject(&Pen);
    PenSelectionne.Detach();DeleteObject(&PenSelectionne);
    PenDeplace.Detach();DeleteObject(&PenDeplace);
    PenSelectionneDeplace.Detach();DeleteObject(&PenSelectionneDeplace);
    PenNettoyage.Detach();DeleteObject(&PenNettoyage);

    font.Detach();DeleteObject (&font);
    font2.Detach();DeleteObject (&font2);

    EconomiseurEcran(TRUE);


    PostQuitMessage(0);
    //_exit(0); //pour voir ....même effet que PostQuitMessage(0)
    }

    void CCdeNumFraisView::OnAppExit()
    {
    OnDestroy();
    }





    Pile des appels dans deux cas de sortie de l'appli

    /*********************************
    Après click sur bouton de sortie du toolbar
    **********************************/
    MFC42! 73d211c7()
    MFC42! 73db8d32()
    MFC42! 73d27419()
    NTDLL! 7c9111a7()
    NTDLL! 7c933f31()
    KERNEL32! 7c81cd76()
    KERNEL32! 7c81cdee()
    MSVCRT! 77c09d45()
    MSVCRT! 77c09e78()
    MSVCRT! 77c09e90()
    CCdeNumFraisDoc::OnButtonsortie(CCdeNumFraisDoc * const 0x00000000 {CCdeNumFraisDoc}) line 375 + 7 bytes

    /********************************
    Après click sur la case de fermeture de l'appli
    *********************************/
    MFC42! 73d211c7()
    MFC42! 73db8d32()
    MFC42! 73d27419()
    NTDLL! 7c9111a7()
    NTDLL! 7c933f31()
    KERNEL32! 7c81cd76()
    KERNEL32! 7c81cdee()
    MSVCRT! 77c09d45()
    MSVCRT! 77c09e78()
    MSVCRT! 77c09e90()
    CFormulaire::OnDestroy(CFormulaire * const 0x00000000 {CFormulaire hWnd=???}) line 407 + 7 bytes

  6. #6
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    il y a de gros problemes de conception dans ton appli ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CCdeNumFraisView::OnAppExit() 
    {
    OnDestroy(); 
    }
    On appelle jamais OnDestroy() directement. C'est le systeme qui le fait via un message WM_DESTROY suite à un DestroyWindow()
    De cette façon tu ne fais pas une destruction totale et propre (manque WM_NCDESTROY et cie) et au final pour une vue le PostNcDestroy() ...
    C'est pas la bonne façon de faire ...

    Ton code pour le nettoyage des ressources tu peux le mettre dans PostNcDestroy() qui pour une vue donne sur un delete this (donc appeler la classe de base en dernier, après avoir fait le nettoyage)
    Mais si tes objets sont des classes du style CPen, c'est pas nécessaire, le destructeur de ces classes s'en charge déjà très bien

    d'ailleurs en passant, pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pen.Detach();DeleteObject(&Pen);
    donc laisser les MFC détruire les fenetres, ce qui est fait automatiquement.
    d'ailleurs pourquoi redefinir OnAppExit() qui existe dans CWinApp ?

    je comprends pas trop ce que tu souhaites faire, mais ce que tu présentes, c'est pas bon du tout ...

    @+

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Merci StephDim

    J'ai suivi tes conseils et j'ai réglé le problème.

    Etant un amateur autodidacte je programme intuitivement sans avoir des bases bien solides.
    Lorsque j'ai un problème je préfère poser une question sur le forum que de compulser un doc volumineuse et souvent en anglais.
    C'est plus efficace ...
    Ce forum est super, soutenu par des personnes "calées" comme toi.

    A bientôt peut-être

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Réponses: 2
    Dernier message: 10/06/2002, 11h03
  5. [MFC] ADO connection
    Par philippe V dans le forum MFC
    Réponses: 3
    Dernier message: 10/06/2002, 07h36

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