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

C++ Discussion :

Modification d'une fonction "ShellExit"


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Par défaut Modification d'une fonction "ShellExit"
    Bonjour,
    j'ai trouvé une fonction assez utile, qui permet de terminer un processus. La voici :
    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
    bool ShellExit(char *ExeName) 
    { 
        //Recherche du processus: 
        HANDLE hSnapShot; 
        PROCESSENTRY32 uProcess; 
        bool r; 
        short PID = 0; //variable qui va stocker l'ID du processus de l'application que l'on désire fermer. 
     
        hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); 
        uProcess.dwSize = (DWORD) sizeof(PROCESSENTRY32); 
     
        r = Process32First(hSnapShot, &uProcess); 
        do // Cette boucle énnumère tout les processus 
        { 
            if ( strstr(uProcess.szExeFile, ExeName) )//on cherche le nom de notre application dans le chemin d'accès de l'éxécutable du processus. 
                PID = (short) uProcess.th32ProcessID; 
     
            r = Process32Next(hSnapShot, &uProcess); 
        } while ( r ); 
     
        CloseHandle(hSnapShot); 
     
        if ( PID == 0) 
            return false; 
     
        //Fermeture du processus: 
        HANDLE hTemp; 
     
        hTemp = OpenProcess(PROCESS_ALL_ACCESS, false, (DWORD) PID); 
        TerminateProcess(hTemp,0); 
     
        return true; 
    //Attention: le nom de l'éxécutable est écrit ou tout en majuscule, ou comme il est orthografier sur le disque dur. Il faut parfois faire plusieurs text pour un seul nom d'executable. 
    }
    Je voudrais maintenant modifier cette fonction pour que, au lieu de terminer un processus, elle en lance un nouveau. Je pense que se sont les dernières lignes qu'il faut changer, mais je n'y arrive pas.
    Pouvez-vous m'aider ?
    Merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Beurk! Cette fonction est horrible (TerminateProcess etc.).
    (Encore que, j'ai fait un truc à la fois plus propre et plus crade: injecter dans le processus un thread qui appelle ExitProcess())

    pour que, au lieu de terminer un processus, elle en lance un nouveau
    Que veux-tu dire par là? Lancer un nouveau processus à partir du même exécutable ?
    Bien, si tu as déjà le nom de l'exe, tu n'as pas du tout besoin de cette fonction-là (sauf si c'est pour récupérer le chemin complet): Tu appelles CreateProcess() directement...
    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 confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Par défaut
    Bah en gros je veux faire une fonction qui prend en paramètre un nom d'executable. Ensuite la fonction lance l'executable...et c'est tout.
    Tu as une idée de comment faire ca ?

  4. #4
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    C'est de la programmation windows ça ?

    En fait on voit souvent ce genre de post avec de la programmation système qui ne m'a pas l'air portable...

    Je me pose une question est qu'il est possible d'utiliser les Inter Process Communication Posix sur les systèmes windows?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu trouveras du code pour faire ça dans les FAQs C et VC++.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Par défaut
    J'ai essayé la fonction std::system() mais elle me fait apparaître une console alors que je programme avec l'API Windows. J'ai essayé de cacher la console avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowWindow(GetConsoleWindow(),SW_HIDE);
    mais ca ne marche pas. Une idée ?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Utilise CreateProcess (c'est indiqué dans la FAQ non ?).

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Par défaut
    CreateProcess lance une appli, c'est vrai, mais il faut avoir le chamin du prog. Or je veux pouvoir lancer une application en ayant juste son nom. J'ai essayé avec ShellExecute, mais je n'arrive pas à l'utiliser.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Comment voudrais-tu lancer un exécutable sans savoir où il se trouve ?

    Regardé ça par exemple :

    http://c.developpez.com/faq/vc/?page...ead#ProcessNew
    http://c.developpez.com/faq/vc/?page=Registry#RunWord

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Par défaut
    On peut terminer un processus sans conaître son adresse, alors pourquoi pas pouvoir le lancer ?
    Merci pour tes deux liens, mais je suis déjà allé voir. Je n'ai pas réussi à utiliser la fonction ShellExecute, la seule qui ne nécessite pas d'adresse. Ca plante à la ligne CString. Bizar comme type de variable. J'ai fais une recherche sur la msdn pour avoir plus d'info, mais même avec les directives et les libs, ca marche pas.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    On peut terminer un processus sans conaître son chemin, alors pourquoi pas pouvoir le lancer ?
    Parce que quand le programme est lancé, windows sait où se trouve l'exécutable. Ta fonction ShellExit() cherche parmi tous les processus si l'un d'eux possède le nom de l'exécutable dans son chemin (même si c'est dans le nom d'un dossier: c'est fait à la porc) et tue le processus de la manière sanglante.

    En modifiant la fonction ShellExit, tout ce que tu arriverais à faire, c'est lancer une seconde instance d'un programme s'il y en a déjà une en exécution (et encore, comme c'est programmé à la RACHE, c'est pas sûr que ça tombe juste).
    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.

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    CString c'est du MFC, il ne faut pas que tu utilises ce genre de variable. Utilise simplement un std::string ou un char*.

Discussions similaires

  1. Modification d'une fonction pour selectionner une plage de cellule
    Par jackbauer972 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/08/2007, 15h07
  2. Réponses: 13
    Dernier message: 11/12/2006, 14h44
  3. Aide sur modification d' une fonction.
    Par superadnan3 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2006, 17h29

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