Fermeture d'application

cs_xavier77 Messages postés 95 Date d'inscription jeudi 27 décembre 2001 Statut Membre Dernière intervention 17 avril 2013 - 7 déc. 2006 à 11:36
zavier666 Messages postés 266 Date d'inscription mardi 7 septembre 2004 Statut Membre Dernière intervention 30 avril 2009 - 18 déc. 2006 à 19:58
Bonjour à tous,
J'ai développé deux applications (app1 et app2) en VB6.
app1 est une sorte de menu qui sert a appeler app2. app2 est lancé avec la commande SHELL puis j'utilise l'API SetParent pour que app2 soit dans app1... Je sauvegarde le handle de app2 de maniere a ce que si l'utilisateur reclique sur le menu de app1 pour app2, cela reactive app2 sans le lancer a nouveau. Pour cela, je controle avec l'API IsWindow si app2 est deja ouvert ou pas.

Jusque la tout se passe plutot bien... par contre, lorsque app2 plante (et oui ca arrive malheureusement lol!!) il se ferme mais reste dans la liste des processus actif.
Je cherche donc un moyen de pouvoir tuer ce processus sachant que j'ai toujours son Handle de stoché...
J'ai essayé d'utiliser de les API TerminateProcess et CloseHandle mais sans succes.

Merci de votre aide...
Xavier

6 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
7 déc. 2006 à 16:16
Salut,


Je crois que tu appel TerminateProcess avec le handle de la fenêtre et non du processus. Attention : il y a une différence.


Tu peux récupérer le handle de ton processus en le crant via CreateProcess.


Bonne chance.


@+
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
11 déc. 2006 à 14:17
salut,

partant d'un handle de fenêtre, et pour obtenir un handle de processus, tu peux utiliser l'api GetWindowThreadProcessId afin de récupérer le processid du programme puis utiliser openprocess pour obtenir un handle du processus (avec le droits PROCESS_TERMINATE) que tu vas utiliser avec terminateprocess puis closehandle...

ou sinon effectivement, http://vb.developpez.com/faq/?page=Systeme#close_exe

ShareVB
0
cs_xavier77 Messages postés 95 Date d'inscription jeudi 27 décembre 2001 Statut Membre Dernière intervention 17 avril 2013
15 déc. 2006 à 09:14
merci pour vos réponse...
Les api terminateprocess et closehandle marche correctement sauf dans mon cas car il faut considérer que le programmes est planté.
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
15 déc. 2006 à 09:43
salut,

normalement terminateprocess c'est comme kill -9 sous linux, c'est vraiment du brute de chez brute...normalement quelque soit l'état d'un processus que tu as créé, tu dois pouvoir le killer...le seul cas où tu ne peux pas le faire c'est quand un débuggeur est en fonction pour ton programme qui plante...

http://forum.sysinternals.com/forum_posts.asp?TID=4464
http://www.experts-exchange.com/Programming/Programming_Platforms/Win_Prog/Q_10225778.html
http://support.microsoft.com/kb/231844

ShareVB
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 déc. 2006 à 16:44
C'est moche, mais tu peux peut être essayer la commande tskill du DOS.
Elle prend le nom de l'exe en paramètre. Elle est présente sous XP, et
au moins souvent sous 2k.


shell "tskill app2"

devrait suffire.


Mais c'est certainement rien d'autre qu'un TerminateProcess...
0
zavier666 Messages postés 266 Date d'inscription mardi 7 septembre 2004 Statut Membre Dernière intervention 30 avril 2009 1
18 déc. 2006 à 19:58
Tu trouveras le détail de toutes les fonctions utilisées sur mon site API @ la loupe http://xav.prog.power.free.fr :

Voici le tuto sur "terminer un processus":

I) Préparatifs
Pour les besoins de l'exemple, il est nécessaire d'ouvrir le Bloc-notes.

II) Obtenir le handle du processus à tuer
Dans un premier temps, il est nécessaire d'obtenir le handle de la fenêtre du Bloc-notes:
handle_fen = FindWindow(vbNullString, "Sans titre - Bloc-notes")

A partir de ce handle de fenêtre, il est possible d'obtenir le handle du processus correspondant:
r = GetWindowThreadProcessId(handle_fen, handle_process)

III) Ouvrir le processus
Cette étape ouvre le processus en mode Interrogation et Terminate, ce qui permettra d'obtenir le code de sortie du processus et de le tuer par la suite
hproc_ouvert = OpenProcess(&H1 + &H400, False, handle_process)

IV) Obtenir le code de sortie du processus
Maintenant que l'on connaît le handle du processus (processus ouvert en mode interrogation), il est possible d'obtenir le code de sortie de celui-ci:
r = GetExitCodeProcess(hprocess_ouvert, exit_code)

V) Tuer le processus
r = TerminateProcess(hproc_ouvert, exit_code)

VI) Fermer la handle
r = CloseHande(hproc_ouvert)
0
Rejoignez-nous