cs_xavier77
Messages postés95Date d'inscriptionjeudi 27 décembre 2001StatutMembreDernière intervention17 avril 2013
-
7 déc. 2006 à 11:36
zavier666
Messages postés266Date d'inscriptionmardi 7 septembre 2004StatutMembreDernière intervention30 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.
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 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...
cs_xavier77
Messages postés95Date d'inscriptionjeudi 27 décembre 2001StatutMembreDernière intervention17 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é.
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 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...
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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...
zavier666
Messages postés266Date d'inscriptionmardi 7 septembre 2004StatutMembreDernière intervention30 avril 20091 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)