Connaitre le pid à partir du handle d'un processus

Signaler
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
comment récuperer le pid d'un processus lancé avec shellexecute ? (avec createprocess j'ai fait c'est plus simple)

j'ai utilisé shellexecutex, et avec ca j'ai pu récuperer le handle du processus crée, mais a part de celui ci, comment je trouve le pid ? (sachant ke j'ai trouvé sur msdn une fonction GetProcessId mais qui est implémenté uniquement sur XP SP1, et que mon header windows.h ne contient de toutes facons pas... dc sans doute ya un autre moyen)

il faudrait la fonction 'réciproque' de openprocess. quelqu'un connait ?

8 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Tu as un hprocess.
Lance EnumWindows.
Dans enumProc a chaque tour:
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
h = OpenProcess(..., pid);
if(h) {
CloseHandle(h)
if(h = hprocess) {
YOUPI pid; stop enum;
}
}

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
OUPS, faute de frappe comme d'hab.
if(h == hprocess) {
...

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ok merci ;)
jme demandais si yavait moyen de faire autrement mais bon.
la au- ca marche, dc c'est l'essentiel
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ha ben finalement ca a pas l'air de marcher.
la raison : les handle retournés par OpenProcess sont des trucs temporaires. dc cad qu'un meme processus peut avoir des handle différents, tout dépend du moment ou on ouvre son process. et des processus différents peuvent avoir des meme valeurs de handle... si on a fermé le handle du processus d'avant en tout cas, c'est possible
ex:


void ListerPs()
{
   HANDLE hSnapShot;
   PROCESSENTRY32 uProcess;
   int r;
   short PID = 0; 
   
   hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   uProcess.dwSize = (DWORD) sizeof(PROCESSENTRY32);
                                                  
   r = Process32First(hSnapShot, &uProcess);
   do      {
      PID = (short) uProcess.th32ProcessID;
   
      HANDLE hTemp = OpenProcess(PROCESS_ALL_ACCESS, false, (DWORD) PID);
      
      printf("handle : %d    pid : %d \n",hTemp,PID);

      CloseHandle(hTemp);
      r = Process32Next(hSnapShot, &uProcess);
   } while ( r );
   CloseHandle(hSnapShot);
}

ca affiche la meme valeur de handle pour tous les processus.

Le handle retourné par OpenProcess est un identifiant qui est unique, meme si on ouvre 2 fois le meme process... qd on fait closeHandle, la valeur de ce handle peut etre re aloué pour n'importe quel autre processus.
d'ou le probleme !
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Dans tous les cas, CreateProcess est bien mieux si tu peux l'utiliser.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
oué j'ai vu. jme demande meme s'il est possible de récuperer le pid d'un processus lancé avec shellexecute. jpense que c'est possible que ca soit non en tout cas...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
J'ai fait exemple pour qqun dans lequel je lance notepad vide et ensuite dans une EnumWindows je retrouve la fenetre par rapport au pid, je change son titre et je mets du texte dans cette fenetre notepad.
Comme quoi le pid n'a pas change depuis le lancement.
Mets moi un message avec un mail pour t'envoyer exemple si tu veux.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ben c'est sur le pid il change jamais... mais le handle qu'on récupere avec OpenProcess sur un meme pid lui il peut changer. la valeur de ce handle peut meme etre la meme pour des processus différents, il suffit d'avoir fait closehandle entre temps... La je veu pa trouver quelque chose par rapport au pid, je veut l'inverse : trouver le pid a partir d'un handle. ce qui n'a pas l'air possible