Processus en cours d'execution? Psapi.lib et Psapi.h? `EnumProcesses@12` & `Get

Résolu
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 - 18 févr. 2009 à 16:21
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 - 22 févr. 2009 à 22:51
Bonjour,

 J'essaie en vain de compiler un petit bout de code me permettant de vérifier
 si telle ou telle processus et bien en cour d'execution.
 Mais j'obtiens 2 erreurs empechant le compilateur de compiler le code source.
 Suite à une recherche j'ai découvert qu'il fallait ajouter la librairie "psapi.lib"
 au projet se que j'ai donc immédiatement fait puis j'ai aussi ajouter le header psapi.h
 en include mais cella n'a absolument rien changer donc j'aimerais savoir si quelqu'un
 avait une solution éventuellement pour me permettre de compiler se code source ?

 Le code source :
 
#include <windows.h>
#include <string.h>
#include
#include <stdio.h>

// Determine si un processus est en cours d'execution ou pas
BOOL process_exists(const char* monProcess)
{
    DWORD processes[200], nb_processes;
    char process_name[100];
    int i;
    HANDLE hprocess;
   
    EnumProcesses(processes, sizeof(processes),&nb_processes);
        //On teste tous les processus pour voir si leur nom correspond
    for(i=0;i<nb_processes/sizeof (DWORD);i++)
      {
        hprocess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processes[i]);
        //Prend le nom du processus et le met dans process_name
        GetModuleBaseName(hprocess, NULL, process_name, sizeof(process_name) );
        CloseHandle(hprocess);
                //Ce processus est il le même que celui demandé
        if(!strcasecmp(process_name, monProcess)){
            return TRUE;
        }
    }
    return FALSE;
}

int main()
{
    if(process_exists("nom_process.exe")){
       printf("1. oui");
    }
    else{
       printf("1. non");
    }
   
    printf( "\n" );
   
    if(process_exists("main.exe")){
       printf("2. oui");
    }
    else{
       printf("2. non");
    }
       
    system( "pause" );
   
    return 1;
}

  Voici les erreurs obtenue lors de la tentative de compilation par Dev C++ :

     [Linker error] undefined reference to `EnumProcesses@12'
     [Linker error] undefined reference to `GetModuleBaseNameA@16'
     ld returned 1 exit status
     E:\Projets\****\Makefile.win [Build Error]  [projet.exe] Error 1

Cordialement.

10 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 févr. 2009 à 18:36
Salut,

[Linker error]

Linker. Lieur. Tu as une erreur à l'édition des liens. L'édition des liens a lieu après la compilation. C'est la phase ou les divers .o sont liés entre eux et que pas mal d'adresses de symboles sont résolus.

Les deux symboles qu'il te manque sont dans des dlls de Windows. Il te faut donc que tu mette le .lib ou .a décrivant cette dll en entrée du lieur, quelque part dans les options de dev-cpp (Soit dit en passant, tu connais Code::Blocks ? C'est une très bonne alternative dans le même esprit). Dans ton cas, il s'agit probablement de Psapi.lib.

Pour toutes les fonctions,il y a un tableau à la fin qui dit si la fonction est unicode, qui donne le .h, le .lib, les versions minimales, la dll...
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 févr. 2009 à 18:46
Poste croisé avec BruNews... Cela dit vu le message d'erreur, le compilo semble trouver tranquillement la fonction dans le windows.h.

Voilà la fenêtre. Il faut que tu ajoutes -lPsapi dans la zone de droite, celle qui a déjà des trucs dedans sur la capture.
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 févr. 2009 à 09:23
Pourquoi -lPsapi et pas Psapi ? Tu utilises dev-cpp, donc gcc, donc ld pour le link. Donc il faut consulter la doc de ld. ld propose l'option -lar pour lier avec une lib ar.

Concernant ton problème d'application qui n'affiche rien... Je crois me souvenir que cela peut être dû au fait que tu compiles une application en mode GUI, et pas en mode console. Le system("pause") est affiché dans une console car en interne, c'est en gros un CreateProcess de cmd /C pause qui est exécuté. Bilan ça te lance une (nouvelle) console avec pause dedans. Si tu avais déjà une console, cmd s'exécuterait dans la console existante sans problème.

Ton .exe est compilé en mode GUI/Windows. Il faut que tu changes cela dans les options de compilation pour que ton exe soit console.
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 févr. 2009 à 18:33
essaie avec:
#define _WIN32_WINNT 0x0600
#include <windows.h>

DANS CET ORDRE

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
18 févr. 2009 à 22:34
Salut,
Le define ne change rien comme l'inclusion du fichier psapi.lib ( que j'avais déja fait ).
Je ne vois vrément pas d'ou pourrais venir l'erreur,
peut etre qu'il faut que j'inclus en plus une autre librairie voir carrément un autre entete?

Au passage c'est bien le fichier psapi.lib qu'il faut inclure au projet?
Parceque dans ton screen c'est pas vrément ce que j'ai vu,
puis tu dis -lPsapi au lieu de Psapi, une mauvaise compréhention
de ma par ou une erreur de frappe de la tienne?

Oui je connais Code::Blocks mais j'ai plus tendance
aprés chaque formatage à utilisé par réflexe Dev C++ vieu réflexe ^^"
0
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
20 févr. 2009 à 00:05
Toujours aucune idées?
   
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 févr. 2009 à 00:32
Utilise VC++ 2008, c'est gratuit en version Express.

ciao...
BruNews, MVP VC++
0
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
20 févr. 2009 à 00:48
D'accord mais en quoi le changement de compilateur pourra m'aider pour ce souci de librairie? 
0
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
20 févr. 2009 à 01:13
Changement dans l'inclusion de la librairie suite a une petite recherche,
j'ai pu observer que certaine personne on mis


-lPsapi au lieu de



psapi.lib



donc aprés en avoir fait de même le code source a enfin étais compiler et l'exécuatable créer !
( Meme si j'ai pas bien compris pourquoi menfin bref ! )

Mais, mais...le résultat n'est pas du tous celui attendu mais vrément pas du tous,
on dirait que la fonction process_exists auquel on fait plusieurs fois apelle dans
le code source n'est enfaite pas appelé ! Car dans la fenetre dos du programme on n'obtient
que le message dû a la ligne de code suivante :
     system( "pause" ) ;
et on à aucune trace des oui et non plus haut, donc j'ai décidé de recompilé le code source
mais cette fois en insérent dans cette fonction un petit : puts( "fonction" ) ;
et je n'obtient toujours aucun autre message que le message systeme !
Ma fonction n'est donc pas appelé? Comment cella se fait il?! 
0
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
22 févr. 2009 à 22:51
Exactement sa fonction ^^
  merci pour vos aides respectifs
Et pour la doc sur l'Id Bonne continuation...
0
Rejoignez-nous