cs_User8
Messages postés30Date d'inscriptionjeudi 24 juillet 2008StatutMembreDernière intervention13 novembre 2012
-
18 août 2009 à 09:50
cs_User8
Messages postés30Date d'inscriptionjeudi 24 juillet 2008StatutMembreDernière intervention13 novembre 2012
-
24 août 2009 à 09:31
Bonjour,
J'ai un bout de code où je lance un process A via createprocess.
Ce process A peut appeler différent process fils qui eux même peuvent lancer des process fils...
Existe-t-il un moyen simple pour stopper(killer) le process A et par la même occasion tous ses descendants? TerminateProcess tue le process A mais pas les descendants. j'ai une méthode qui liste récursivement les descendants puis vient les tuer un par un. N'y a t il pas de méthode plus simple et surtout moins risqué? Peut on utiliser la fenêtre par exemple?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 22 août 2009 à 15:24
Je pense que la méthode qui liste récursivement les descendants est bien suffisante, surtout qu'il n'y aura pas tant de processus à killer. Mais pense à tuer du plus jeune (le plus recemment créé) au plus ancien, sinon des problèmes peuvent survenir.
cs_User8
Messages postés30Date d'inscriptionjeudi 24 juillet 2008StatutMembreDernière intervention13 novembre 2012 24 août 2009 à 09:31
Merci Bacterius!
Je tue mes processus en partant des descendants les plus bas dans l'arbre et je remonte jusqu'au processus pere.
Voila la source:
procedure killAllProcessesFrom(procId : DWORD);
var
SnapShot: Cardinal;
ProcessEntry: TProcessEntry32;
processhandle : thandle;
begin
//Création de "l'instantané"
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
//En cas d'erreur on sort
If SnapShot = 0 then Exit;
ProcessEntry.dwSize := SizeOf(ProcessEntry);
//On liste les processus
If Process32First(SnapShot, ProcessEntry) then
begin
Repeat
//si le processus courant est le parent, on descend dans l'arbre
if ProcessEntry.th32ParentProcessID = procId
then killAllProcessesFrom(ProcessEntry.th32ProcessID)
until not Process32Next(SnapShot, ProcessEntry)
end;
//Libération de l'instantané
CloseHandle(SnapShot);
//Suppression du process courant
processhandle := openprocess(PROCESS_TERMINATE, FALSE, procID);
if processhandle<>0 then terminateprocess(processhandle,0);
End;