Bonjour,
Comme l'indique le titre j'aimerais tuer un process qui tourne à partir de C++, c'est a dire sans passer par le gestionnaire des taches....
Merci d'avance
Bonjour,
Comme l'indique le titre j'aimerais tuer un process qui tourne à partir de C++, c'est a dire sans passer par le gestionnaire des taches....
Merci d'avance
c bon, apres une petite recherche sur internet je crois que j'ai trouvé une bonne procedure que je lui donne le nom du processus et elle fé le kill... pour ceux qui en auront besoin voici le corps de cette fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 KillCurrentProcess(char *name, bool& result) { //déclaration des variables HANDLE adr; PROCESSENTRY32 proc; short id=0; int r; //creation d'un Snapshot(de type TH32CS_SNAPALL) des processus en cours d'execution //renvoie le "handle" du "snapshot" spécifié en paramètre adr = CreateToolhelp32Snapshot(2,0); //boucle pour parcourir les processus (par Process32Next)et tester la condition do{ r = Process32Next(adr, &proc); if (strstr(proc.szExeFile,name) ) id =proc.th32ProcessID; }while(r); if( (adr=OpenProcess(PROCESS_TERMINATE,FALSE,id)) !=NULL) { if (TerminateProcess(adr, 0)!= 0) { result = true; } } else { system("cls"); result = false; } }
Sachant que le seul fait de tuer un processus est tout sauf recommandé, car aucun objet n'est correctement détruit (et les DLLs ne sont pas non plus prévenues de la fin du process, alors qu'elles le sont normalement). Ce qui peut être un problème en cas d'utilisation de mémoire partagée dans plusieurs processus...
En fait, il est limite plus propre d'injecter dans le processus en question un thread qui appelle ExitProcess()...
J'ajouterai également que pour pouvoir ouvrir un processus (OpenProcess()), l'application doit avoir le privilège SE_DEBUG_NAME. Ensuite, que ce programme ne marche pas pour les raisons suivantes:
- Process32Next() sans Process32First()
- La boucle ne fait qu'énumerer tous les processus en cours donc ton OpenProcess() va ouvrir le dernier processus énuméré.
- Toujours dans la boucle : même si Process32Next() échoue, on continue toujours avec if (strstr(proc.szExeFile,name) ) ...
- Fonction déclarée int mais ne retournant rien
SE_DEBUG_NAME n'est nécessaire que pour les processus d'un autre utilisateur.
Voici une version plus correcte qui intègre la destruction de plusieurs mêmes processus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 void KillProcess(const char *name) { HANDLE hSnapshot; PROCESSENTRY32 proc; int result; // Création d'un Snapshot(de type TH32CS_SNAPALL) des processus en cours d'execution // Renvoie le "handle" du "snapshot" spécifié en paramètre hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); result = Process32First(hSnapshot, &proc); // Boucle pour parcourir les processus (par Process32Next) et tester la condition while (result) { if (!strcmp(proc.szExeFile, name)) { hSnapshot = OpenProcess(PROCESS_TERMINATE,FALSE, proc.th32ProcessID); if(hSnapshot != NULL) { TerminateProcess(hSnapshot, 0); hSnapshot = CreateToolhelp32Snapshot(2,0); } } result = Process32Next(hSnapshot, &proc); } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager