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] Terminer le processus lié au programme en cours


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut [MFC] Terminer le processus lié au programme en cours
    Bonjour à tous.


    J'aimerai savoir comment je peux faire pour qu'à partir d'un bouton sur un CDialog je puisse terminer un processus en cours.

    J'ai lu quelque part qu'il faut utiliser GetCurrentProcessId mais je ne retrouve pas cela dans l'index de mon aide. Le processus à tuer est celui de l'application en cours.

    J'utilise VC++.NET 2002

    Merci pour toutes vos suggestions.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExitProcess( <code de retour> );
    Note que ce n'est pas une bonne méthode : c'est violent, tous tes objets alloués ne sont pas libérés, etc... Donc mieux vaut faire ça proprement en fermant les fenêtres, à moins que tu ais un besoin bien spécifique.

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExitProcess( <code de retour> );
    Note que ce n'est pas une bonne méthode : c'est violent, tous tes objets alloués ne sont pas libérés, etc... Donc mieux vaut faire ça proprement en fermant les fenêtres, à moins que tu ais un besoin bien spécifique.
    quelles valeurs peut prendre code de retour. Je lui ai attribué la valeur 0 et il me sort une erreur de
    Violation d'aacès lors de la lecture de l'emplacement ....

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut

    Normalement ça n'a rien à voir. La valeur c'est celle que tu veux, c'est ce qui est renvoyé par main() normalement. 0 c'est très bien.
    Execute depuis le debugger pour trouver là où ça plante.

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Voici mon bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void CChoix::OnBnClickedAnnuler()
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
    	if (AfxMessageBox("Voulez-vous quitter l'application?",MB_YESNO|MB_ICONQUESTION )==IDYES)
    	{
    		//AfxGetMainWnd()->PostMessage(WM_SYSCOMMAND,SC_CLOSE,0); 
    		CChoix::OnCancel();
    		ExitProcess(0);
    	}
    	else 
    		return;
    }
    il plante au iveau de Merci pour ta volonté.

  6. #6
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Une question qui me vient à l'esprit. Comment tester le fait que ce processus soit en cours d'exécution?

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu veux fermer l'appli qui contient ton code ? c'est ca ? ou bien tu veux fermer une autre application ?
    Pourquoi ne pas simpliment finir l'application comme il faut ?

  8. #8
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par nico-pyright(c)
    tu veux fermer l'appli qui contient ton code ? c'est ca ? ou bien tu veux fermer une autre application ?
    Pourquoi ne pas simpliment finir l'application comme il faut ?
    Le problème est que la fermeture de l'application affiche aussi un message pour demander si on veut fermer. Donc si je passe par là il m'affiche le message plus d'une fois.

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je vois ...

    pourquoi fais-tu l'appel à CChoix::OnCancel(); ?

  10. #10
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par nico-pyright(c)
    je vois ...

    pourquoi fais-tu l'appel à CChoix::OnCancel(); ?
    Pour fermer la fenêtre en cours.

  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
    salut,
    ou EndDialog(IDCANCEL);

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Si tu as bien fait toutes tes sauvegardes, libérés tout ce qu'il faut, ExitProcess doit fonctionner, sinon, utiliser TerminateProcess, mais risque de leak

  13. #13
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Utiliser WM_CLOSE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CChoix::OnBnClickedAnnuler() 
    { 
       // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle 
       if (AfxMessageBox("Voulez-vous quitter l'application?",MB_YESNO|MB_ICONQUESTION )==IDYES) 
       { 
          SendMessage(WM_CLOSE);
       } 
       else 
          return; 
    }
    d'ailleur nul besoin de return;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CChoix::OnBnClickedAnnuler() 
    { 
       // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle 
       if (AfxMessageBox("Voulez-vous quitter l'application?",MB_YESNO|MB_ICONQUESTION )==IDYES) 
          SendMessage(WM_CLOSE);
     
    }

  14. #14
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par nico-pyright(c)
    Si tu as bien fait toutes tes sauvegardes, libérés tout ce qu'il faut, ExitProcess doit fonctionner, sinon, utiliser TerminateProcess, mais risque de leak
    Je ne comprends vraiment rien aux processus.
    Dans l'iade on a ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BOOL TerminateProcess(
      HANDLE hProcess, // handle to the process
      UINT uExitCode   // exit code for the process
    );
    Je ne sais pas ce que je dois lui passer comme paramètres.

    Merci

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TerminateProcess(GetCurrentProcess(),0);

  16. #16
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    [quote="Ti-R"]Utiliser WM_CLOSE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CChoix::OnBnClickedAnnuler() 
    { 
       // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle 
       if (AfxMessageBox("Voulez-vous quitter l'application?",MB_YESNO|MB_ICONQUESTION )==IDYES) 
       { 
          SendMessage(WM_CLOSE);
       } 
       else 
          return; 
    }
    Lorsque je procède ainsi le programme reste en mémoire. Ce qui fait que si j'essaie de lancer l'application cela ne se fait pas puisqu"il y a une autre instance en cours.

  17. #17
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par nico-pyright(c)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TerminateProcess(GetCurrentProcess(),0);

    Merci beaucoup.

    Cela marche déjà.

    En espérant que c'est pour de bon

    MERCI

  18. #18
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    [quote="annedjomo"]
    Citation Envoyé par Ti-R
    Utiliser WM_CLOSE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CChoix::OnBnClickedAnnuler() 
    { 
       // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle 
       if (AfxMessageBox("Voulez-vous quitter l'application?",MB_YESNO|MB_ICONQUESTION )==IDYES) 
       { 
          SendMessage(WM_CLOSE);
       } 
       else 
          return; 
    }
    Lorsque je procède ainsi le programme reste en mémoire. Ce qui fait que si j'essaie de lancer l'application cela ne se fait pas puisqu"il y a une autre instance en cours.
    ???

    WM_CLOSE est plus propre que TerminateProcess...

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_close.asp

    Il faut attendre un peu.

    Regarde les 2 docs

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcekernl/html/_wcesdk_win32_terminateprocess.asp

  19. #19
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Ton plantage m'intrigue quand même. Je pensais pas que c'était possible.

    http://msdn.microsoft.com/library/en-us/dllproc/base/exitprocess.asp
    In contrast, if a process terminates by calling TerminateProcess, the DLLs that the process is attached to are not notified of the process termination. Therefore, if you do not know the state of all threads in your process, it is better to call TerminateProcess than ExitProcess. Note that returning from the main function of an application results in a call to ExitProcess.

    Calling ExitProcess in a DLL can lead to unexpected application or system errors. Be sure to call ExitProcess from a DLL only if you know which applications or system components will load the DLL and that it is safe to call ExitProcess in this context
    L'erreur avec ExitProcess elle dit quoi exactement ? Est-ce qu'il te donne un module (dll) fautif ? Tu l'appelles depuis ton programme ou depuis une dll ?

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

Discussions similaires

  1. D7/terminer le processus sous XP
    Par jer64 dans le forum Delphi
    Réponses: 4
    Dernier message: 15/09/2006, 22h05
  2. Terminer un processus en sauvant
    Par tedparker dans le forum Access
    Réponses: 11
    Dernier message: 15/09/2006, 14h12
  3. D7/terminer le processus
    Par jer64 dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/09/2006, 22h31
  4. Lancer un processus ou un programme
    Par miron dans le forum Windows
    Réponses: 10
    Dernier message: 05/08/2006, 19h14
  5. [mfc]détruire un processus
    Par semenzato dans le forum MFC
    Réponses: 12
    Dernier message: 09/01/2004, 17h01

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