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 397
    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 397
    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 397
    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 397
    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