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 :

Exécuter un .exe externe


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut Exécuter un .exe externe
    Bonjour à tous,

    Je cherche actuellement à faire une fonction me permettant de lancer un programme externe à partir de mon code C++ (je travaille sous C++ Builder 5).
    Cependant, il ne suffit pas de lancer simplement le programme, il faut attendre qu'il se termine avant de continuer les traitements.
    J'ai essayé plusieurs choses, je vous mets mon code avec quelques explications et les problèmes que je rencontre :

    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
    bool __fastcall test::runExternalExecutable(String sDSN, String sUsername, String sPassword, String sSetOrGroup, String sSelData, long worldId, String sResFilePrefix)
    {   
       sExtPath = "C:\\Program Files\\test\\testexe";
     
       String app = "test.exe";
       String param = sDSN + " " + sUsername + " " + sPassword + " " + sSetOrGroup + " " + sSelData + " " + IntToStr(worldId) + " " + sResFilePrefix;
     
       if(!(ShellExecute(NULL, "open", app.c_str(), param.c_str(), sExtPath.c_str(), SW_SHOW) > (HINSTANCE)32))
       {
            String info = "Cannot start '" + app + " " + param + "'";
            Application->MessageBox(info.c_str(), "erreur", MB_OK);
       }
       return FileExists(sResFilePrefix + "_F"); 
     
       //*** problème de l'approche ci-dessus : n'attend pas que que le programme soit terminé avant de continuer
     
      /*HANDLE hProcess;
      DWORD ProcessId;
      DWORD exitCode;
      sExtPath = "C:\\Program Files\\test\\testexe\\";
      String app = "test.exe";
      String param = sDSN + " " + sUsername + " " + sPassword + " " + sSetOrGroup + " " + sSelData + " " + IntToStr(worldId) + " " + sResFilePrefix;
     
      String sCmd = sExtPath + app + " " + param;
      ProcessId = system(sCmd.c_str());
      if(ProcessId == 0)
            Application->MessageBox("erreur", "logSQL", MB_OK);
      else
      {
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, ProcessId);
            do
            {
                    GetExitCodeProcess(hProcess, &exitCode);
                    Application->ProcessMessages();
            }while(exitCode == STATUS_PENDING);
            CloseHandle(hProcess);
      }*/
      return true;
    }
    Pour les constantes utilisées, les voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const short test::PROCESSQUERYINFORMATION = 0x400;
    const long test::STATUSPENDING = 0x103;
    Donc, comme vous pouvez le voir dans le code, le problème de la première approche (qui fonctionne pourtant magnifiquement bien) est que le programme n'attend pas que l'.exe soit terminé avant de continuer ses traitements.
    En ce qui concerne la deuxième approche, elle est censée résoudre le défaut de la première mais ne fonctionne malheureusement pas. Je vois juste la fenêtre de commande de Windows (cmd) se lancer et disparaître en un éclair.

    Voilà, si quelqu'un peut y jeter un coup d'oeil et me donner un p'tit coup d'pouce par la même occasion, je lui en serais fort reconnaissant.
    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Essaie les fonction de la famille _spawn.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Je jette un coup d'oeil.
    Si d'autres idées, n'hésitez pas

  4. #4
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Je pense que tu devrait allez voir du coter de ce lien:
    http://www.codeproject.com/Articles/...ocess-function

    Cela devrait correspondre à ce que tu veut faire.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Merci à vous deux pour vos réponses, j'ai résolu mon problème grâce à la fonction spawnl

  6. #6
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Ou bien il y a system() qui est plus portable (enfin, si on ne code pas en dur le chemin du fichier à exécuter).

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 30/08/2006, 13h51
  2. [C#] Comment interagir avec un EXE externe ?
    Par therock dans le forum C#
    Réponses: 2
    Dernier message: 16/08/2006, 18h56
  3. Comment exécuter un programme externe ?
    Par spikto dans le forum Langage
    Réponses: 12
    Dernier message: 27/06/2005, 16h18
  4. Exécution d'un exe externe
    Par alainvh dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/06/2005, 10h42

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