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 :

Lancement d'un executable puis recupération de son code de retour


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Par défaut Lancement d'un executable puis recupération de son code de retour
    Bonjour,
    Ma question est simple, j'aimerais lancer un executable depuis un code écrit en c avec visual c++ puis recupérer la valeur de retour de mon executable.

    Malheureusement ke ne sais pas faire

    Quelqu'un pourait il m'aider

    Merci

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semenzato
    Ma question est simple, j'aimerais lancer un executable depuis un code écrit en c avec visual c++ puis recupérer la valeur de retour de mon executable.
    system()

    http://man.developpez.com/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Par défaut
    Je n'arrive pas a trouver la commande system() dans la msdn, est ce que tu pourrais m'aider?

    il me semble que system permet d'executer un processus mais pas de recupérer le code de retour de l'executable

    Parce que j'ai utilisé la commande createprocess mais la plateforme d'execution est du windows 3.11 donc ca ne fonctionne pas....

    A+

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semenzato
    Je n'arrive pas a trouver la commande system() dans la msdn, est ce que tu pourrais m'aider?
    Voilà ce que dit la norme :
    Citation Envoyé par n1124
    7.20.4.6 The system function
    Synopsis
    1 #include <stdlib.h>
    int system(const char *string);
    Description
    2 If string is a null pointer, the system function determines whether the host
    environment has a command processor. If string is not a null pointer, the system
    function passes the string pointed to by string to that command processor to be
    executed in a manner which the implementation shall document; this might then cause the
    program calling system to behave in a non-conforming manner or to terminate.
    Returns
    3 If the argument is a null pointer, the system function returns nonzero only if a
    command processor is available. If the argument is not a null pointer, and the system
    function does return, it returns an implementation-defined value.

    §7.20.4.6 Library 317
    Il faut donc trouver le comportement de system() sur Windows 3.11. Ca pas être simple... Il n'a pas une doc ton compilateur pour Windows ?

    Ca a été chaud, mais j'ai trouvé ça :

    http://msdn2.microsoft.com/en-us/lib...4t(VS.80).aspx

    Mais attention, ça ne concerne pas Windows 3.11 qui n'est plus supporté. Tu as besoin d'utiliser un vieux tromblon comme ça ?

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    C'est une commande spécifique à l'OS
    Il faut prendre CreateProcess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CreateProcess(NULL, "C:\\Program Files\\MyApp", ...)
    system bien que standard ne semble pas exister dans le MSDN

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mat.M
    C'est une commande spécifique à l'OS
    Il faut prendre CreateProcess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CreateProcess(NULL, "C:\\Program Files\\MyApp", ...)
    system bien que standard ne semble pas exister dans le MSDN
    Mais si, mais il faut savoir chercher hé hé !

    Archive ça :

    http://msdn2.microsoft.com/en-us/lib...w6(VS.80).aspx

    J'espère que c'est pas du lien 'jetable', avec M$, il faut s'attendre à tout...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Par défaut
    Je te remercie mais le lien que tu viens de me donner ne fonctionne pas..

    Dans la msdn, la fonction createprocess() n'est pas défini pour un os windows 3.11 alors est ce qu'il y a une petite chance qu'il existe?

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semenzato
    Je te remercie mais le lien que tu viens de me donner ne fonctionne pas..
    Je m'en doutais, ça sent le lien dynamique, on est suivi à la trace...



    Voilà le chemin dans MSDN :

    MSDN Library > Development Tools and Languages > Visual Studio 2005 > Visual Studio > Visual C++ > Reference > Libraries Reference > Run-Time Library

  9. #9
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Voilà le chemin dans MSDN :
    MSDN Library > Development Tools and Languages > Visual Studio 2005 > Visual Studio > Visual C++ > Reference > Libraries Reference > Run-Time Library
    Et un extrait pour ceux qui ne veulent pas chercher :
    Run-Time Library Reference
    system

    Execute a command.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int system(
       const char *command 
    );
    Parameters

    command

    Command to be executed.

    Return Value

    If command is NULL and the command interpreter is found, returns a nonzero value. If the command interpreter is not found, returns 0 and sets errno to ENOENT. If command is not NULL, system returns the value that is returned by the command interpreter. It returns the value 0 only if the command interpreter returns the value 0. A return value of – 1 indicates an error, and errno is set to one of the following values:

    E2BIG
    Argument list (which is system dependent) is too big.

    ENOENT
    Command interpreter cannot be found.

    ENOEXEC
    Command-interpreter file has invalid format and is not executable.

    ENOMEM
    Not enough memory is available to execute command; or available memory has been corrupted; or invalid block exists, indicating that process making call was not allocated properly.

    See _doserrno, errno, _sys_errlist, and _sys_nerr for more information on these, and other, return codes.

    Remarks

    The system function passes command to the command interpreter, which executes the string as an operating-system command. system refers to the COMSPEC and PATH environment variables that locate the command-interpreter file (the file named CMD.EXE in Windows NT and later). If command is NULL, the function simply checks to see whether the command interpreter exists.

    You must explicitly flush (using fflush or _flushall) or close any stream before calling system.

    Requirements
    Required header : <process.h> or <stdlib.h>

    Compatibility : ANSI, Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Par défaut
    Je pense utiliser cette commande system mais dans ce cas comment obtenir le code de retour de l'executable?

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semenzato
    Je pense utiliser cette commande system mais dans ce cas comment obtenir le code de retour de l'executable?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ret = system("ma_commande");
    Ca ne me parait pas d'une difficulté insurmontable ?

  12. #12
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ret = system("ma_commande");
    Ca ne me parait pas d'une difficulté insurmontable ?
    Attention tout de meme, la valeur de retour n'est pas utilisable directement, et la facon de recuperer cette valeur depend du systeme (avec system(), ce n'est pas tres surprenant).
    Un exemple sous Linux et Unix:
    On va appeler le programme suivant (compile et appele called):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(void)
    {
      return 147;
    }
    depuis ce programme:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
     
    int main(void)
    {
      int ret = system("called");
     
      printf("Coded: %d\n", ret);
     
      if (WIFEXITED(ret) != 0)
      {
        printf("Decoded : %d\n", WEXITSTATUS(ret));
      }
      else
      {
        printf("Command called by system() failed.\n");
      }
     
      return 0;
    }
    La sortie est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Coded: 37632
    Decoded : 147
    On voit qu'imprimer directement ret ne donne pas la bonne reponse. Il faut utiliser la macro WEXITSTATUS associee a wait() pour "decoder" la valeur (en fait, le "decodage" est simplement un decalage de 8 bits vers la gauche). WIFEXITED() determine si la commande a termine avec succes ou non. J'ignore si l'API Windows utilise un mecanisme similaire.

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Non, l'API Windows donne directement le code de retour.
    D'ailleurs, j'ignorais que sous les unixoïdes, system() retournait un statut (comme wait()) au lieu d'un code de retour...
    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.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Par défaut
    Bonjour,

    pour recuperer le code de retour sous linux:
    apres la fin de l'execution du programme, il suffit de taper sur le terminal:
    echo $status ou echo $?

    mais sous windows je sais pas

    --
    Tox

  15. #15
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par toxycyty
    pour recuperer le code de retour sous linux:
    apres la fin de l'execution du programme, il suffit de taper sur le terminal:
    echo $status ou echo $?
    mais sous windows je sais pas
    Sympa, mais on parle de la façon de le faire depuis un programme en C, pas en ligne de commande ou en shell...

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Heureusement qu'il y a des gens trop gentils pour en faire une règle : Tiens, en Batch, il y a la variable %ERRORLEVEL% qui contient le code de retour...
    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. Quel est le langage de développement de TurboCash et où puis-je trouver son code source
    Par phenix1988 dans le forum Autres Solutions d'entreprise
    Réponses: 0
    Dernier message: 16/05/2011, 12h03
  2. Lancement d'un éxécutable
    Par djn2006 dans le forum Applications et environnements graphiques
    Réponses: 15
    Dernier message: 09/06/2006, 20h28
  3. Lancement d'un executable raté
    Par marsupilami34 dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 15/09/2005, 10h01
  4. [Exécutable]puis je creer un executable a partir de mon code ?
    Par youpileouf dans le forum Général Java
    Réponses: 3
    Dernier message: 17/06/2005, 09h15
  5. Réponses: 2
    Dernier message: 16/06/2005, 14h48

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