IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Obtenir le nom d'un proces a partir de son PID


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Obtenir le nom d'un proces a partir de son PID
    Bonjour,

    Je souhaite en c++ pouvoir retrouver le nom d'un l'application a partir de son PID. Comment faire ?

    En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string MaFonction(int pid)
    {
       return le_nom_de_lapplication_a_partir_de_son_pid
    }
    Merci !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Sur linux, tu peut le savoir a partir de /proc/<PID>/cmdline

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    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é.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    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:
    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
    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&#40;void&#41;
    &#123;
    HANDLE hSnapshot;
    PROCESSENTRY32 pe;
    MODULEENTRY32 me;
    
    pe.dwSize = sizeof&#40;pe&#41;;
    me.dwSize = sizeof&#40;me&#41;;
    
    hSnapshot = CreateToolhelp32Snapshot&#40;TH32CS_SNAPPROCESS,NULL&#41;;
    
    if&#40;Process32First&#40;hSnapshot,&pe&#41;&#41;
    	&#123;
    	do	&#123;
    		HANDLE hSnapshot2;
    
    		printf&#40;"%s &#58; ",pe.szExeFile&#41;;
    		hSnapshot2 = CreateToolhelp32Snapshot&#40;TH32CS_SNAPMODULE,pe.th32ProcessID&#41;;
    		if&#40;hSnapshot2 == INVALID_HANDLE_VALUE&#41;
    			&#123;
    			char buf&#91;80&#93;;
    			FormatMessageA&#40;FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError&#40;&#41;,0,buf,80,NULL&#41;;
    			CharToOemA&#40;buf, buf&#41;;
    			printf&#40;"- ERREUR Snapshot&#58; %s",buf&#41;;
    			continue;
    			&#125;
    
    		if&#40;Module32First&#40;hSnapshot2, &me&#41;&#41;
    			&#123;
    			do	&#123;
    				#ifdef EXE_UNIQUEMENT
    
    				if&#40;strstr&#40;me.szModule,".exe"&#41; || strstr&#40;me.szModule,".EXE"&#41;&#41;
    					&#123;
    					printf&#40;" %s\n",me.szExePath&#41;;
    					&#125;//if exe
    
    				#else
    
    				printf&#40;"%s\n",me.szExePath&#41;;
    
    				#endif
    				&#125; while&#40;Module32Next&#40;hSnapshot2,&me&#41;&#41;;
    			&#125;
    		else//Pas de module du tout/Erreur Module32First
    			&#123;
    			char buf&#91;80&#93;;
    			FormatMessage&#40;FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError&#40;&#41;,0,buf,80,NULL&#41;;
    			printf&#40;"- %s",buf&#41;;
    			&#125;//if Module32First
    
    		puts&#40;" "&#41;;
    		CloseHandle&#40;hSnapshot2&#41;;
    		&#125; while&#40;Process32Next&#40;hSnapshot,&pe&#41;&#41;;
    	&#125;//if Process32First
    CloseHandle&#40;hSnapshot&#41;;
    
    return 0;
    &#125;
    Mais tu n'as même pas forcément besoin de la liste des modules : le champ szExeFile de la structure PROCESSENTRY32 peut suffire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Ca marche merci, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	HANDLE hProcess;
    	char	procName&#91;MAX_PATH&#93;;
    
    	hProcess = OpenProcess&#40;PROCESS_ALL_ACCESS, FALSE, procID&#41;;
    	GetModuleFileNameEx&#40;hProcess, NULL, procName, sizeof&#40;procName&#41;&#41;;
    	CloseHandle&#40;hProcess&#41;;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/11/2013, 17h16
  2. Obtenir le nom complet d'une variable à partir de pageContext
    Par elmessoussi dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 25/03/2008, 18h04
  3. Réponses: 4
    Dernier message: 30/10/2007, 21h03
  4. [Excel-VBA]Nom d'un workbook a partir de son path
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 19/10/2006, 15h34
  5. Obtenir le nom d'un fichier a partir d'un FILE
    Par Syrmonsieur dans le forum C
    Réponses: 9
    Dernier message: 08/06/2006, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo