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++Builder Discussion :

Terminaison de programmes [Sources]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Inscrit en
    Décembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 5
    Par défaut Terminaison de programmes
    Question : comment faire en sorte d'interdire à un utilisateur non autorisé de tuer un programme C++ builder à partir du gestionnaire de tache?. Je pensais qu'il suffisait dans l'application d'intercepter les messages WM_QUIT ou WM_CLOSE : mais ça n'a pas l'air de marcher. Une idée?.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans la Onclose de la fiche principale, faire le test si l'utilisateur
    a le droit de fermer le programme, sans doute ici avec la saisie d'un code
    que l'on demande avec une Dialog :

    Quelque chose qui ressemblerait à ça, dans la OnClose de cette fiche principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    Action = caNone; // par défaut on ne termine pas le programme
    if(FormDialogMotDePasse->ShowModal() == mrOk)
        {
        if(FormDialogMotDePasse->Edit1->Text = "Le mot de passe")
            {
    	Action = caFree; //fermeture du programme
            }
        }
    }
    Bonnes fêtes de fin d'année !

    A plus !

  3. #3
    Membre averti

    Inscrit en
    Décembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 5
    Par défaut Terminaison de programme
    Merci pour l'aide, mais cette solution ne marche pas : elle ne permet d'intercepter que les tentatives de fermeture à partir du programme lui-même. J'ai donc déjà implémenté cette méthode. Ce que je souhaite maintenant c'est empêcher quelqu'un de non autorisé d'interrompre l'exécution de mon programme en utilissant le gestionnaire de tâches de windows.
    J'ai également esayé la méthode suivante donnée dans l'aide C++Builder, mais sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall MyQuit(TMessage& Msg);  // pour gérer les messages interceptés
     
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_QUIT,TMessage,MyQuit)       // pour intercepter l'évènement quit
    MESSAGE_HANDLER(WM_CLOSE,TMessage,MyQuit)    // pour intercepter l'évènement close
    END_MESSAGE_MAP(TForm)
    Quelqu'un a une autre suggestion :

  4. #4
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Va voir chez nos voisins Delphistes
    http://www.developpez.net/forums/viewtopic.php?t=277796

  5. #5
    Membre averti

    Inscrit en
    Décembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 5
    Par défaut Terminaison de programme

    Ca me va très bien merci.

  6. #6
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Si tu adaptes le code pour C++ Builder (ou encore mieux, tu l'améliores) n'hésites pas à le poster dans ce sujet

  7. #7
    Membre averti

    Inscrit en
    Décembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 5
    Par défaut Terminaison de programmes
    Voilà c'est fait. J'ai repris le code delphi pour le passer en C++.
    Cela donne les qq lignes ci-après (J'ai testé et ça fonctionne très bien):
    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
     
    Fichier header
    #include <system.hpp>
    #include <tlhelp32.h>
       DWORD __fastcall GetProcessId(char *nomProgramme);
     
    Fichier cpp
    //------------------------------------------------------------
    //fonction qui retourne l'id d'un process fourni en paramètre
    DWORD __fastcall TSDIAppForm::GetProcessId(char *nomProgramme)
    {
    HANDLE         handle;
    DWORD          pId;
    PROCESSENTRY32 pe;
    bool           fin;
       fin = false;
       pId = 0;
       pe.dwSize = sizeof(PROCESSENTRY32);
       handle = CreateToolhelp32Snapshot(TH32CS_SNAPALL , 0);  //recupere un capture de process
       if ( Process32First(handle, &pe) == true)// recherche premier process de la liste
       {  // on a le premier process de la liste => il faut vérifier si c'est celui-là
          if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
          {  // le process correspond à celui qu'on cherche
            pId = pe.th32ProcessID;   // recupere l'id du process
          }
          else
          {
             while ((Process32Next(handle, &pe) == true) && (fin == false))
             {  //dans le cas contraire du test on continue à chercher le process en question
                if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
                {
                   pId = pe.th32ProcessID;
                   fin = true; // On a trouvé, on peut arrêter la recherche
                }
             }
          }
       }
       CloseHandle(handle);
       return(pId);
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSDIAppForm::TimerGestionnaireDeTacheTimer(TObject *Sender)
    {  // L'objectif est de tuer toute instance lancée du gestionanire de tâche
       // pour éviter qu'un utilisateur puisse tuer l'application sans avoir
       // l'autorisation
    HANDLE   handle;
    DWORD    pId;
       pId = GetProcessId("taskmgr.exe");
       if (pId != 0)
       {  // A priori on a trouvé le programme recherché, il faut vérifier si on peut l'atteindre
          handle = OpenProcess(PROCESS_ALL_ACCESS ,true,pId); //handle du process
          if (handle != NULL)
          { // Ben on l'a trouvé et c'est OK , il n'y plus qu'à le tuer
             TerminateProcess(handle,-9);
             CloseHandle(handle);
          }
       }
    }

  8. #8
    Membre expérimenté
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Par défaut
    Bonjour,

    je voulais juste commenter que cette solution interdit carrément l'affichage du TaskManager, ce qui pourrait être très énervant pour l'utilisateur qui va utiliser ton application! Le mieux serait de trouver un moyen de ne pas afficher l'application par exemple dans la liste des processus qui tournent.

    Je ne sais pas si c'est faisable ou non, mais en tout cas moi je n'utiliserais jamais une appli qui m'empecherait d'afficher le gestionnaire des taches...Pas avec Windows et BCB installés sur ma machine !

    Bon courage

  9. #9
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    J'ai eu à résoudre un problème un peu similaire, bien que pas tout à fait le même. Je l'ai résolu en créant deux programmes, chacun contrôlant régulièrement par des messages l'existence de l'autre (et le relancant s'il disparaît). Comme on ne peut pas tuer deux taches en même temps, ça rend très difficile l'utilisation du gestionnaire de taches pour supprimer simultanément ces deux programmes.

    [edit]Oups! j'ai pas vu que cette solution avait déjà été proposée dans le post en lien.[/edit]

  10. #10
    Membre expérimenté
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Par défaut
    Bonjour,

    Citation Envoyé par 10_GOTO_10
    J'ai eu à résoudre un problème un peu similaire, bien que pas tout à fait le même. Je l'ai résolu en créant deux programmes, chacun contrôlant régulièrement par des messages l'existence de l'autre (et le relancant s'il disparaît). Comme on ne peut pas tuer deux taches en même temps, ça rend très difficile l'utilisation du gestionnaire de taches pour supprimer simultanément ces deux programmes.
    oui c'est pas mal, mais ca pourrait être contourné en développant une petite appli qui tue les deux processus en même temps! J'ai l'air peut être un peu péssimiste, mais pour moi la meilleure solution serait de ne pas du tout voir l'appli lancé...

    D'autres suggestions ?

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

Discussions similaires

  1. Terminaison d'un programme qui utilise des actors.
    Par karatekator dans le forum Scala
    Réponses: 2
    Dernier message: 28/02/2011, 20h12
  2. Exécuter un programme externe et détecter sa terminaison
    Par leserapheen dans le forum Pascal
    Réponses: 10
    Dernier message: 04/10/2006, 17h19
  3. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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