Processus en cours d'execution? Psapi.lib et Psapi.h? `EnumProcesses@12` & `Get [Résolu]

Signaler
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
-
wizard512
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
-
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.
A voir également:

10 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
18
essaie avec:
#define _WIN32_WINNT 0x0600
#include <windows.h>

DANS CET ORDRE

ciao...
BruNews, MVP VC++
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013

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 ^^"
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013

Toujours aucune idées?
   
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
18
Utilise VC++ 2008, c'est gratuit en version Express.

ciao...
BruNews, MVP VC++
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013

D'accord mais en quoi le changement de compilateur pourra m'aider pour ce souci de librairie? 
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013

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?! 
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013

Exactement sa fonction ^^
  merci pour vos aides respectifs
Et pour la doc sur l'Id Bonne continuation...