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

Outils Delphi Discussion :

Récupérer le code de retour d'un .exe avec la commande Exec


Sujet :

Outils Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut Récupérer le code de retour d'un .exe avec la commande Exec
    Bonjour

    Je souhaiterai savoir s'il est possibl de récupérer le résultat de mon programme car je lui ai dit de retourner -3 pour un type d'erreur et -1 autrement.

    Le hic c'est que la fonction Exec n'a pas l'air de récupérer ces codes de retour lorsque je fais un try catch (disons que meme si le programme exe ne marche pas il considère que la commande shell elle c'est bien passée. logique on me dira mais moi ça m'aide pas).

    Bref si vous connaitriez une option à rajouter, j'ai bien essayé un DosError mais inno setup me dit qu'il lui faut un BEGIN et je ne vois pas pourquoi et quand je mets ce BEGIN ça ne marche pas mieux (il me dit Identifier expected à la ligne uses...)

    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
     
    function Filesystem(Param : String): String;
    BEGIN
    Uses
    	Dos;
    Var
    	ResultCde: Integer;
    	Dir : String;
    begin
    	ResultCde := 0;
    	Dir := ExpandConstant('{app}')+'/lib';
        Exec('cmd', ExpandConstant('/c monprog.exe parameters'), '', SW_SHOW, ewWaitUntilTerminated, ResultCde);
        ResultCde:=DosError;
        MsgBox('ResultCde= ''' + ResultCde + '''.', mbInformation, mb_Ok);
        Result := Dir;
    end;
    END;

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 031
    Par défaut
    J'ignore d'où vient cette fonction Exec, moi je ne l'ai ni dans Delphi, ni dans l'API,

    sinon, tient j'ai participer à ce sujet , il peut t'intéresser pour remplacer Exec par CreateProcess\CreatePipe
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut
    Citation Envoyé par ShaiLeTroll Voir le message
    J'ignore d'où vient cette fonction Exec, moi je ne l'ai ni dans Delphi, ni dans l'API
    Sauf erreur de ma part nous sommes dans un script InnoSetup. Sous IS la fonction Exec existe bien. Un genre de ShellExecute destiné uniquement aux exécutables et batch.

    @pyrofrag
    Donc je verrais plutôt quelque chose comme ça:
    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
     
    [Code]
    function FileSystem(Param: string): string;
    var
      ResultCde: Integer;
    begin
      Result := '';
      if Exec('MonProg.exe', Params, '', SW_SHOW, ewWaitUntilTerminated, ResultCde) then
      begin
        // OK
        MsgBox(Format('Exit code = %d', [ResultCde]), mbInformation, mb_Ok);
        Result := ExpandConstant('{app}')+'\lib';
      end
      else
        // Echec
        MsgBox(Format('Error code = %d', [ResultCde]), mbInformation, mb_Ok);
    end;
    @+ Claudius

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    J'ignore d'où vient cette fonction Exec, moi je ne l'ai ni dans Delphi, ni dans l'API,

    sinon, tient j'ai participer à ce sujet , il peut t'intéresser pour remplacer Exec par CreateProcess\CreatePipe
    Ce n'est peut être pas en Delphi mais bel et bien présent en Pascal :
    http://cyberzoide.developpez.com/info/turbo/chap10.php3

    A la fin tu verras il parle de la fonction Exec et sinon sur le net j'ai trouvé pas mal de tutos.
    @Claudius : Merci pour ta réponse je vais essayer c'est vrai que moi j'avais déjà fait le test if sur le fonction Exec en pensant que le retour d'erreur serait remonté (i.e. que la fonction Exec retournerait faux si mon programme avait retourné faux) mais finalement ça ne marche pas mais peut etre que resultcode lui me donnera satisfaction

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Je me bats toujours avec cette histoire de programme...

    J'ai essayé deux méthodes :
    Exec('cmd',ExpandConstant('/c mon progs.exe mes params'), ' ', SW_SHOW, ewWaitUntilTerminated, ResultCde)
    et
    Exec('my prog.exe','my params', '', SW_SHOW, ewWaitUntilTerminated, ResultCde)

    et rien n'y fait il me retourne les codes DOS suivant :
    Runtime error 1 - Invalid function number
    Runtime error 2 - File not found
    Runtime error 3 - Path not found
    Runtime error 4 - Too many open files
    Runtime error 5 - File access denied
    Runtime error 6 - Invalid file handle
    Runtime error 12 - Invalid file access code
    Runtime error 15 - Invalid drive number
    Runtime error 16 - Cannot remove current directory
    Runtime error 17 - Cannot rename across drives

    mais pas le retour d'erreur de mon programme .exe....

    Et j'ai beau cherché je ne trouve aucune info sur cette fonction Exec !!!!!!

  6. #6
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    salut,

    c'est très bizarre !!
    En théorie ça fonctionne soit avec Exec ou ShellExec.
    Quel est le code d'erreur ? Est ce le code 2 systématiquement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exec('cmd',ExpandConstant('/c mon progs.exe mes params'), ' ', SW_SHOW, ewWaitUntilTerminated, ResultCde)
    C'est clair que dans ce cas tu testes le code de retour de la commande 'cmd' et pas de ton programme (je pense).

    Il faut faire attention au moment où tu appelles ton programme, es-tu sûre qu'il est déjà copié au bon endroit ? J'ai eu ce pb, et j'ai dû faire l'exécution de mon prog dans l'étape ssPostInstall, pas avant.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exec('cmd',ExpandConstant('/c mon progs.exe mes params'), ' ', SW_SHOW, ewWaitUntilTerminated, ResultCde)
    Après plusieurs modifs j'ai enfin réussi à récupéer le code d'érreur par la commande que tu as décrite ci dessus. J'ai une différentes erreurs (notament le fait que inno setup exécute 2 fois le code donc la 1ere fois mes fichiers ne sont pas copiés alors que j'apelle la fonction après... j'ai pas trop saisi mais bon ça passe j'ai hiddé ma fenetre..

    Mon problème maintenant c'est pour exécuter mon fichier.exe qd l'utilisateur à choisi un dossier avec des espaces dedans genre program files bah ExpandConstant retourne :
    C:\Program
    Files\folder...

    et impossible de le joindre sur une seule ligne malgré addition de quotes et autre caractères..

    Je chercherai demain j'avais laissé de coté le pb j'étais content ce soir d'avoir réussi ce foutu Exec mais là cette histoire de ligne découpé en 2 ça me gonfle grave

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2014, 14h27
  2. Récupérer le code de retour d'un job Talend
    Par DevServlet dans le forum Exécution et industrialisation
    Réponses: 12
    Dernier message: 26/09/2011, 14h53
  3. [bash]récupérer un code de retour
    Par GLDavid dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 25/04/2008, 14h16
  4. [Ruby] Récupérer le code de retour
    Par K20 dans le forum Ruby
    Réponses: 4
    Dernier message: 29/10/2007, 16h49
  5. Réponses: 1
    Dernier message: 28/02/2007, 11h59

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