Bonjour,
Je souhaite en c++ pouvoir retrouver le nom d'un l'application a partir de son PID. Comment faire ?
En gros :
Merci !Code:
1
2
3
4
5 string MaFonction(int pid) { return le_nom_de_lapplication_a_partir_de_son_pid }
Version imprimable
Bonjour,
Je souhaite en c++ pouvoir retrouver le nom d'un l'application a partir de son PID. Comment faire ?
En gros :
Merci !Code:
1
2
3
4
5 string MaFonction(int pid) { return le_nom_de_lapplication_a_partir_de_son_pid }
Sous unixoïde ?
Si ps et top savent le faire, ce doit être possible.
Sous Windows,
il faut regarder du coté de CreateToolHelp32Snapshot() et ses fonctions filles...
Sur linux, tu peut le savoir a partir de /proc/<PID>/cmdline
Oui je programme sous windows.
Mais "CreateToolHelp32Snapshot()" me permet de snapshoter UN SEUL et UNIQUE pid ? J'ai peur de devoir lister tous les processus en cours d'execution et de faire un "if" sur le pid de la liste... ce qui est loin d'être optimal.
Il n'y a pas de fonctions c++ qui me permettent de récuperer directement une structure contenant les infos sur un process depuis son pid ? Je ne trouve pas de mon coté.
CreateToolHelp32Snapshot() Permet de dresser une liste de tous les process (mais ne donne de liste détaillée (threads, modules) que sur l'un d'entre eux.
(À ton avis, à quoi sert la fonctio Module32First()) ?
J'ai déjà fait une fonction qui énumérait chaque module de chaque process:
Mais tu n'as même pas forcément besoin de la liste des modules : le champ szExeFile de la structure PROCESSENTRY32 peut suffire.Code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> int main(void) { HANDLE hSnapshot; PROCESSENTRY32 pe; MODULEENTRY32 me; pe.dwSize = sizeof(pe); me.dwSize = sizeof(me); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); if(Process32First(hSnapshot,&pe)) { do { HANDLE hSnapshot2; printf("%s : ",pe.szExeFile); hSnapshot2 = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe.th32ProcessID); if(hSnapshot2 == INVALID_HANDLE_VALUE) { char buf[80]; FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,buf,80,NULL); CharToOemA(buf, buf); printf("- ERREUR Snapshot: %s",buf); continue; } if(Module32First(hSnapshot2, &me)) { do { #ifdef EXE_UNIQUEMENT if(strstr(me.szModule,".exe") || strstr(me.szModule,".EXE")) { printf(" %s\n",me.szExePath); }//if exe #else printf("%s\n",me.szExePath); #endif } while(Module32Next(hSnapshot2,&me)); } else//Pas de module du tout/Erreur Module32First { char buf[80]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,buf,80,NULL); printf("- %s",buf); }//if Module32First puts(" "); CloseHandle(hSnapshot2); } while(Process32Next(hSnapshot,&pe)); }//if Process32First CloseHandle(hSnapshot); return 0; }
C'est spécifique Win32, je déplace.
En plus direct, tu récupères un handle sur le process via OpenProcess et son nom via GetModuleFileNameEx.
Cependant il peut y avoir des limitations à cause des privilèges si t'es pas admin tu des process autres que les tiens. POur cela GetProcessImageFileName est moins restrictif, mais n'est dispo qu'à partir de XP.
Fait une recherche sur le forum
Ca marche merci, voici le code :
Code:
1
2
3
4
5
6
7 HANDLE hProcess; char procName[MAX_PATH]; hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID); GetModuleFileNameEx(hProcess, NULL, procName, sizeof(procName)); CloseHandle(hProcess);