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

Visual C++ Discussion :

Probl�me d'utilisation structure PROCESSENTRY 32


Sujet :

Visual C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2013
    Messages
    48
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2013
    Messages : 48
    Par d�faut Probl�me d'utilisation structure PROCESSENTRY 32
    Bonjour,
    Dans le cadre de mon projet BTS, j'ai une m�thode de mon application charg�e de d�tecter si un processus .exe est d�marr�e ou non. Pour cela, elle lit la liste des processus ouverts dans Windows, parcoure cette liste et si le nom est identique � celui pass� en param�tre, elle r�cup�re son PID et me renvoie un bool�en.
    Sauf qu'elle n'arrive pas � trouver le processus.
    Apr�s de multiples tests, j'ai trouv� la cause. Le membre de la structure PROCESSENTRY32 charg�e de renvoy� le nom du process me renvoie une adresse et je ne comprend pas pourquoi.

    Cette application est d�velopp�e en C++ orient� objet sous Visual Studio 2010. La fonction incrimin�e a �t� test� avec succ�s sous Codeblocks en C++ mais non orient� objet (toutes les fonctions �taient dans le fichier main).
    C'est suite � ces tests que j'ai pass� le programme en objet.

    Voici la m�thode :
    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
    bool Serveur::etatProcess(const char *nom)
    {
        DWORD pid = 0;
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 process;
        ZeroMemory(&process, sizeof(process)); // rempli la zone mémoire de 0
        process.dwSize = sizeof(process);
        if(Process32First(snapshot, &process))
        {
    	do
            {
     
    		// process.szExeFile renvoie une adresse, la comparaison ne peux donc se faire
    		// pourquoi ?
    		if(strcmp((char *)process.szExeFile, nom) == 0) // 0 => comparaison ok
                    {
    			pid = process.th32ProcessID;
                            break;
                    }
            }while(Process32Next(snapshot, &process));
        }
        CloseHandle(snapshot);
        if (pid != 0)
        {
             return true;
        }
        else
        {
    	return false;
        }
    }
    merci de votre aide

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Si tu dois caster, c'est qu'il y a un probl�me.

    Un probl�me de TCHAR, je parie. Bienvenue au 21e si�cle.
    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
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2013
    Messages
    48
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2013
    Messages : 48
    Par d�faut
    La fonction strcmp ne prend que des char*
    Il faudrait donc le convertir avant, je n'y avais pas pens� j'essayerai.
    Par contre, en affichant process.szExeFile, il m'affiche une adresse (du moins �a y ressemble), pourquoi ?

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    _tcscmp() d�clar�e dans <tchar.h> prend des TCHAR. Normalement, tu devrais utiliser des TCHAR partout, dans toute l'application, d'un bout � l'autre.

    szExeFile est un tableau de TCHAR.
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2013
    Messages
    48
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2013
    Messages : 48
    Par d�faut
    J'ai, je pense, r�solu le probl�me ...
    J'ai converti l'argument pass� en param�tre en string et le membre szExeFile de la structure en string.
    Puis j'ai fait une comparaison avec la m�thode string::compare.
    Et �a marche

    Le code est encore un peu brouillon mais il fonctionne
    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
    bool Classe::etatProcess(const char *nom)
    {
        string val(nom); // const char * => string
        DWORD pid = 0;
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 process;
        ZeroMemory(&process, sizeof(process)); // rempli la zone mémoire de 0
        process.dwSize = sizeof(process);
        if(Process32First(snapshot, &process))
        {
            do
            {
    	       string exe = tcharVersString(process.szExeFile); // fonction perso convertissant tchar * vers string
    	       if (val.compare(exe) == 0)
                   {
                         pid = process.th32ProcessID;
                         break;
                   }
            }while(Process32Next(snapshot, &process));
        }
        CloseHandle(snapshot);
        if (pid != 0)
        {
             return true;
        }
        else
        {
    	return false;
        }
    }

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Sauf que c'est dans l'autre sens que tu aurais d� faire �a: Convertir nom en basic_string< TCHAR >...

    Ou mieux, faire ladite conversation aussi loin en amont que possible.
    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.

Discussions similaires

  1. Probl�me d'utilisation de structures
    Par melissar dans le forum C
    R�ponses: 18
    Dernier message: 30/04/2013, 22h45
  2. R�ponses: 4
    Dernier message: 03/03/2010, 09h08
  3. Probl�me d'utilisation de structure en C++
    Par marcix dans le forum C++
    R�ponses: 1
    Dernier message: 08/12/2007, 12h47
  4. Probl�me d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    R�ponses: 10
    Dernier message: 06/08/2004, 14h35
  5. probl�me d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    R�ponses: 4
    Dernier message: 03/12/2003, 10h44

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