- Killer un processus [C++ sous Windows] - C++ - Programmation
Marsh Posté le 05-02-2005 à 11:05:46
Euh personne ne saurait ?
Meme avec une autre méthode pour la création du processus (que ShellExecute) ?
snif
Marsh Posté le 05-02-2005 à 11:22:10
Worldofdada a écrit : Euh personne ne saurait ? |
Si vous avez le pid, c'est plutôt simple:
Code :
|
(tests à ajouter, doc à lire, ...)
Marsh Posté le 05-02-2005 à 17:14:12
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.
Marsh Posté le 07-02-2005 à 09:24:39
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
Marsh Posté le 07-02-2005 à 11:54:56
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
Marsh Posté le 07-02-2005 à 14:35:00
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 :
|
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
Marsh Posté le 07-02-2005 à 15:44:23
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 ?
Marsh Posté le 07-02-2005 à 16:48:31
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
Marsh Posté le 08-02-2005 à 01:02:08
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.
Marsh Posté le 10-02-2005 à 18:29:20
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
Marsh Posté le 11-02-2005 à 11:26:42
Worldofdada a écrit : hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pi.dwProcessId); |
tu peux pas utiliser directement pi.hProcess ?
Marsh Posté le 12-02-2005 à 17:27:30
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)
Marsh Posté le 14-02-2005 à 20:21:38
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 :
|
Marsh Posté le 18-02-2005 à 14:23:24
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 ...
Marsh Posté le 18-02-2005 à 15:57:25
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 ?
Marsh Posté le 21-02-2005 à 20:59:04
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
Marsh Posté le 21-02-2005 à 22:34:36
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.
Marsh Posté le 02-02-2005 à 16:09:40
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