Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1583 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++ sous Windows] - Killer un processus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++ sous Windows] - Killer un processus

n°969560
Worldofdad​a
Posté le 02-02-2005 à 16:09:40  profilanswer
 

Bonjour !
 
A partir d'une application Win32Application, je lance un executable Win32ConsoleApplication grace a la commande ShellExecute.
 
Mais voilà, je voudrais que lorsque je ferme mon programme principal, celà ferme également l'application "fille" qui est bloquée en attendant (c'est lié a du corba : lancement du service d'annuaire).
 
Bref, le problème n'est pas de savoir où je dois placer le code mais quel code mettre avec mon PostQuitMessage.
Je l'ai déjà fais sous Linux - Unix mais le fonctionnement de Windows n'est pas le meme et je n'arrive pas a trouver sur le net la méthode pour killer un processus a partir d'un autre processus.
 
J'aimerais savoir dans un premier temps si c'est possible et dans un second temps, savoir si vous n'auriez pas des sources ou des tutos.
J'ai cherché sur le net mais j'ai pas trouvé pour mon cas ....  :(  
 
Merci beaucoup
Damien

mood
Publicité
Posté le 02-02-2005 à 16:09:40  profilanswer
 

n°972666
Worldofdad​a
Posté le 05-02-2005 à 11:05:46  profilanswer
 

Euh personne ne saurait ?
 
Meme avec une autre méthode pour la création du processus (que ShellExecute) ?
 
snif

n°972668
docmaboul
Posté le 05-02-2005 à 11:22:10  profilanswer
 

Worldofdada a écrit :

Euh personne ne saurait ?
 
Meme avec une autre méthode pour la création du processus (que ShellExecute) ?
 
snif


 
Si vous avez le pid, c'est plutôt simple:
 

Code :
  1. HANDLE hProcess=OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
  2. TerminateProcess(hProcess, 0);
  3. CloseHandle(hProcess);


 
(tests à ajouter, doc à lire, ...)

n°972856
HelloWorld
Salut tout le monde!
Posté le 05-02-2005 à 17:14:12  profilanswer
 

En fait si tu utilises ShellExecuteEx( SEE_MASK_NOCLOSEPROCESS ) ou CreateProcess pour lancer ton processus tu peux récupérer directement le hProcess et ainsi faire TerminateProcess & CloseHandle après.


Message édité par HelloWorld le 05-02-2005 à 17:14:27

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°973127
Worldofdad​a
Posté le 06-02-2005 à 11:50:08  profilanswer
 

cool, je vais tester ca :)  
 
merci

n°973725
Worldofdad​a
Posté le 07-02-2005 à 09:24:39  profilanswer
 

Bon j'ai malheureusement des petits problèmes.
 
Je ne connais pas le pid de mon processus donc je ne peux utiliser OpenProcess. J'ai cherché sans trouver des fonctions pour connaitre le pid d'un processus avec son HINSTANCE.
 
Ensuite, le ShellExecuteEx( SEE_MASK_NOCLOSEPROCESS ) passe a la compilation si je rajoute le cast (LPSHELLEXECUTEINFO) SEE_MASK_NOCLOSEPROCESS mais par contre, ca plante a l'execution (Access violation).
Et j'ai pas vraiment compris comment marchait cette fonction ... demande le hProcess du dernier processus ouvert avec ShellExecute ?
 
J'avoue etre un peu perdu sur ce coup.
Vous n'auriez pas un exemple de création de processus et de fermeture a me donner par hasard ?
 
 
Merci beaucoup
Damien

n°973898
HelloWorld
Salut tout le monde!
Posté le 07-02-2005 à 11:54:56  profilanswer
 

Tu dois appeler OpenProcess afin d'avoir le hProcess, mais c'est pas la peine car tu l'as directement si tu utilises CreateProcess ou ShellExecuteEx au lieu de ShellExecute. Perso je préfère CreateProcess, mais avec ShellSexecuteEx ça marche aussi. Il faut initialiser une structure SHELLEXECUTEINFO et lui filer.
http://msdn.microsoft.com/library/ [...] teinfo.asp
fMask doit contenir le flag SEE_MASK_NOCLOSEPROCESS afin de récupérer le hProcess. Sorti de là les premiers paramètres c'est les même que ShellExecute. Faut pas oublier d'initialiser la taille de la structure (cbSize) avec sizeof( SHELLEXECUTEINFO ) et ça devrait marcher.
Sinon un petit CreateProcess et c'est très bien aussi
http://msdn.microsoft.com/library/ [...] rocess.asp


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°974059
Worldofdad​a
Posté le 07-02-2005 à 14:35:00  profilanswer
 

Effectivement CreateProcess a l'aide beaucoup plus simple a utiliser.
 
Mais malheureusement, j'ai un pb avec (c'est vraiment pas ma période de dev en ce moment).
 
Si je fais :

Code :
  1. PROCESS_INFORMATION pi;
  2. STARTUPINFO si;
  3. HANDLE hProcess;
  4. ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
  5. ZeroMemory(&si, sizeof(STARTUPINFO));
  6. CreateProcess("LancerAnnuaire.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, (LPSTARTUPINFO) &si, (LPPROCESS_INFORMATION) &pi);
  7. hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pi.dwProcessId);
  8. TerminateProcess(hProcess, 0);
  9. CloseHandle(hProcess);


 
Ca a l'air d'etre bon : ma fenetre Win32ConsoleApplication s'ouvre et se ferme directement (un peu rapide pour mes yeux).
Maintenant, si je rajoute la moindre fonction entre la création et la destruction du processus (MessageBox, Sleep ou autre), le processus n'est pas killé.
 
Si je modifie le OpenProcess en mettant TRUE a la place de FALSE, le processus disparait dans le gestionnaire des procs Windows mais par contre, l'exe tourne encore (je comprend pas du tout).
 
Pour info, LancerAnnuaire.exe est le processus que je lance a partir d'un autre et il est chargé de démarrer un annuaire pour le fonctionnement de Corba et c'est bloquant.
 
Etant donné que mon but serait de fermer ce processus a la fermeture de mon appli principale, il faudrait que ca puisse marcher (meme si c'est pas vraiment indispensable : c'est juste un peu contraignant de fermer 2 fenetres au lieu d'une).
 
Savez vous d'où ce problème peut il venir ?
Merci beaucoup pour vos aides.
Damien

n°974153
HelloWorld
Salut tout le monde!
Posté le 07-02-2005 à 15:44:23  profilanswer
 

Citation :

Maintenant, si je rajoute la moindre fonction entre la création et la destruction du processus (MessageBox, Sleep ou autre), le processus n'est pas killé.


ben c'est plutot normal. Si tu mets une fonction genre MessageBoxn tant que t'as pas cliqué ok ben tu restes bloqué à msgbox, donc TerminateProcess n'est pas appelé et donc c'est pas tué. C'est juste que ton process se termine avant que tu appelles Terminate() donc y'a plus rien à killer.

Citation :

Si je modifie le OpenProcess en mettant TRUE a la place de FALSE, le processus disparait dans le gestionnaire des procs Windows mais par contre, l'exe tourne encore (je comprend pas du tout).


Il "tourne" où ? Ton processus parent est une appli console ou pas ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°974294
Worldofdad​a
Posté le 07-02-2005 à 16:48:31  profilanswer
 

Mon processus parent est une application Win32Application et mon fils une Win32ConsoleApplication.
 
Quand je dis que le fils n'est pas tué, c'est evidemment apres avoir cliqué sur la boite de message.
 
Et ce qui est bizarre, c'est que le gestionnaire des processus dit que le process fils est pas terminé avec le terminate. Or la fenetre existe encore et l'appli fils tourne encore car si je relance une deuxieme fois, j'ai une erreur de l'annuaire (qui me dit qu'il est déjà lancé).
 
Comme si le fait que l'appli fils soit bloquant (en gros boucle infinie), fait qu'il tourne meme si le processus est killé .... très bizarre cette affaire.
 
Merci

mood
Publicité
Posté le 07-02-2005 à 16:48:31  profilanswer
 

n°975013
HelloWorld
Salut tout le monde!
Posté le 08-02-2005 à 01:02:08  profilanswer
 

Citation :

Quand je dis que le fils n'est pas tué, c'est evidemment apres avoir cliqué sur la boite de message.


as-tu testé le retour de TerminateProcess() ?

Citation :

Et ce qui est bizarre, c'est que le gestionnaire des processus dit que le process fils est pas terminé avec le terminate. Or la fenetre existe encore et l'appli fils tourne encore car si je relance une deuxieme fois, j'ai une erreur de l'annuaire (qui me dit qu'il est déjà lancé).


Mais si ton appli mère est une Win32 pure, alors le fils a sa propre console et tu le vois si il tourne ou pas non ?
Soit le processus est killé, soit il l'est pas (échec de TerminateProcess). Y'a pas de processus killé qui tourne encore.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°977912
Worldofdad​a
Posté le 10-02-2005 à 18:29:20  profilanswer
 

Je viens de débugger et TerminateProcess me renvoi 1.
 
A ce moment là, le processus n'apparait plus dans la liste des processus du gestionnaire mais la fenetre est encore là.
 
Si je continue plus loin, j'ai une alerte (que je n'ai pas sans le debug) :
The Thread 0xD44 has exited with code 16252836 (0xF7FFA4)
 
 
et quand je ferme l'appli "mere", celà donne :
The Thread 0xD14 has exited with code 0 (0x0)
 
Mais la fenetre est toujours là, et l'appli fille fonctionne toujours (la fenetre est présente et l'appli fonctionne réellement) malgres qu'elle ne soit plus dans la liste des processus.
 
Est ce que celà peut venir de :
  - Enable Run Time Type Information
  - Multithreaded DLL
qui sont 2 options que je suis obligé de prendre pour le fonctionnement de mon appli.
 
Merci beaucoup
Damien
 

n°978438
blackgodde​ss
vive le troll !
Posté le 11-02-2005 à 11:26:42  profilanswer
 

Worldofdada a écrit :

hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pi.dwProcessId);  


 
tu peux pas utiliser directement pi.hProcess ?


---------------
-( BlackGoddess )-
n°979548
Worldofdad​a
Posté le 12-02-2005 à 17:27:30  profilanswer
 

Si je met pi.hProcess (avec un cast), le TerminateProcess me renvoi 0 et le processus n'est pas killé (meme pas dans le gestionnaire des processus)

n°981469
HelloWorld
Salut tout le monde!
Posté le 14-02-2005 à 20:21:38  profilanswer
 

SI le process dusparait du taskmgr c'est qu'il est tué. Si la console reste c'est qu'elle est partagée par un autre process, au hasard le process père.
Pas besoin du OpenProcess, y'a pas à caster pour passer pi.hProcess à TerminateProcess.

Code :
  1. TerminateProcess( pi.hProcess, 0 );
  2. CloaseHandle( pi.hThread );
  3. CloaseHandle( pi.hProcess );


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°986154
Worldofdad​a
Posté le 18-02-2005 à 14:23:24  profilanswer
 

Toujours pareil .... vous allez me prendre pour un débile mental mais je confirme que le processus n'est plus dans le taskmgr) mais la fenetre est encore là et qui plus est : elle continue a fonctionner très bien (ma connexion est toujours ouverte).
 
C'est peut etre un processus spécifique a Corba qui tourne derriere mais quand meme bizarre ...
D'ailleurs, c'est surement ca : mon appli fille lance un exe corba (encore un autre processus).
 
Pour des raisons techniques, je suis obligé de passer par 3 processus au total :
Appli Mere --> Appli fille --> Executable corba
 
Ce qui fait que je ne peux peut etre pas killer l'appli fille tant que l'exe corba tourne.
Le pb c'est que je n'ai pas d'info de l'exe corba dans mon appli mere....
 
compliqué tout ca ...

n°986281
HelloWorld
Salut tout le monde!
Posté le 18-02-2005 à 15:57:25  profilanswer
 

Si le process disparait du taskmgr il est killé. Maintenant s'il avait lancé un autre exe alors c'est normal que ce dernier ne le soit pas. Et comme le fils hérite de la console du père la fenêtre console reste active.
Ton appli fille elle fait quoi après avoir lancé l'appli corba ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°989156
Worldofdad​a
Posté le 21-02-2005 à 20:59:04  profilanswer
 

Rien, elle attend ... je passe par un proc fille pour la simplicité et parce que j'avais quelques pbs quand le code de la fille était intégré a la mere

n°989314
HelloWorld
Salut tout le monde!
Posté le 21-02-2005 à 22:34:36  profilanswer
 

Ah... C'est bizarre quand même, car si ton appli fille se contente de lancer un autre appli corba, ben lancer directement corba depuis le père devrait pas changer grand chose.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++ sous Windows] - Killer un processus

 

Sujets relatifs
wsh et ADSI sous windows 98[PHP] exec et process cmd (windows 2000)
Ajouter une ligne à la fin d'un fichier .txt sous windowsComment lire une bdd SQL Server sous windows depuis Linux
MySQL Windows et SSLtelechargement du jmf version windows svp
Récupérer la langue en cours sous Linux, Windows et MacOSAppel d'une fenêtre de windows ?
synchronisation de processus sans lien de parentéProbleme Windows icone -> URL
Plus de sujets relatifs à : [C++ sous Windows] - Killer un processus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR