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

Langage Delphi Discussion :

Comment récupérer le message et le code de retour d'une fonction envoyée sur le terminal (cmd.exe)


Sujet :

Langage Delphi

Vue hybride

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

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 222
    Par défaut Comment récupérer le message et le code de retour d'une fonction envoyée sur le terminal (cmd.exe)
    Bonjour à tous,

    Aujourd'hui je m'essaye à récupérer le message et le code de retour d'une fonction envoyée sur le terminal (cmd.exe)
    J'ai essayé un nombre important de solutions à partir de la commande CreateProcess sans parvenir à un résultat cohérent
    par exemple :
    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
     
        if CreateProcess(nil, PChar('cmd.exe /c ' + CommandLine),
          nil, nil, True, CREATE_NO_WINDOW, nil, nil, StartupInfo, ProcessInfo) then
        begin
          // ------ essai 1 ---- lire aOutput, devrait renvoyer le code d'erreur
          WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
          GetExitCodeProcess(ProcessInfo.hProcess, aOutPut);
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
     
          // ------ essai 2 ---- lire OutputStr devrait renvoyer le message
          ZeroMemory(@Buffer, SizeOf(Buffer));
          CloseHandle(StdOutPipeWrite);
     
          while ReadFile(StdOutPipeRead, Buffer, SizeOf(Buffer) - 1, BytesRead, nil) and (BytesRead > 0) do
          begin
            Buffer[BytesRead] := #0;
            OutputStr := OutputStr + string(Buffer);
          end;
     
          WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
     
          Result := Trim(OutputStr);
        end;
    Et à chaque fois, le message renvoyé dit que "n'est pas reconnu ..."

    J'essaye la commande : java -version
    Dans le terminal, pas de soucis quand j'envoie la commande "cmd.exe /c java -version" mais avec le code, ça ne fonctionne pas.

    Vous pouvez m'aider ?

  2. #2
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 509
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    Et à chaque fois, le message renvoyé dit que "n'est pas reconnu ..."
    Bonjour patrice
    Vérifie si la variable est présente dans les variables de l'environnement Windows.

    Nom : Capture d’écran 2025-05-25 102417.png
Affichages : 128
Taille : 44,7 Ko
    https://commentouvrir.com/tech/comme...us-windows-10/

    cmd.exe /c java -version
    Nom : Capture d'écran 2025-05-25 103156.png
Affichages : 126
Taille : 12,2 Ko

  3. #3
    Membre éclairé

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 222
    Par défaut
    Bonjour XeGregory, oui, j'ai bien mis dans le path les accès ...

    Il n'y a que dans le code Delphi que ça ne fonctionne pas, en direct via le terminal tout est ok

    Nom : 2025-05-25_104008.jpg
Affichages : 125
Taille : 47,3 Ko

    Je pense que c'est l'utilisation de CreateProcess qui pose problème ou alors le renvoie et le traitement de l'info, mais je ne vois pas où

  4. #4
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 509
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    Bonjour XeGregory, oui, j'ai bien mis dans le path les accès ...
    Il n'y a que dans le code Delphi que ça ne fonctionne pas, en direct via le terminal tout est ok
    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
    60
    61
    62
    63
    64
    65
    procedure ExecuteCommand(const CommandLine: String; out OutputMsg: String; out ExitCode: DWORD);
    var
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
      SecurityAttr: TSecurityAttributes;
      hRead, hWrite: THandle;
      Buffer: array[0..255] of AnsiChar;
      BytesRead: DWORD;
      Cmd: string;
    begin
      OutputMsg := '';
      SecurityAttr.nLength := SizeOf(TSecurityAttributes);
      SecurityAttr.bInheritHandle := True;
      SecurityAttr.lpSecurityDescriptor := nil;
     
      if not CreatePipe(hRead, hWrite, @SecurityAttr, 0) then
        raise Exception.Create('Impossible de créer le pipe.');
     
      try
        ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
        StartupInfo.cb := SizeOf(StartupInfo);
        StartupInfo.hStdOutput := hWrite;
        StartupInfo.hStdError  := hWrite;
        StartupInfo.dwFlags    := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        StartupInfo.wShowWindow:= SW_HIDE;
     
        Cmd := 'cmd.exe /c ' + CommandLine;
        if not CreateProcess(nil, PChar(Cmd), nil, nil, True,
          CREATE_NO_WINDOW, nil, nil, StartupInfo, ProcessInfo) then
          raise Exception.Create('Erreur lors de la création du processus.');
     
        try
          WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
     
          if not GetExitCodeProcess(ProcessInfo.hProcess, ExitCode) then
            raise Exception.Create('Impossible de récupérer le code de retour.');
     
          CloseHandle(hWrite);
          hWrite := 0;
     
          repeat
            if ReadFile(hRead, Buffer, SizeOf(Buffer) - 1, BytesRead, nil) then
            begin
              Buffer[BytesRead] := #0;
              OutputMsg := OutputMsg + string(Buffer);
            end;
          until BytesRead < (SizeOf(Buffer) - 1);
        finally
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
        end;
      finally
        if hRead <> 0 then CloseHandle(hRead);
        if hWrite <> 0 then CloseHandle(hWrite);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Msg: String;
      Code: DWORD;
    begin
      ExecuteCommand('java -version', Msg, Code);
      ShowMessage('Message : ' + Msg + sLineBreak + 'Code de retour : ' + IntToStr(Code));
    end;

  5. #5
    Membre éclairé

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 222
    Par défaut
    Nom : 2025-05-25_104734.jpg
Affichages : 174
Taille : 15,1 Ko

    Merci pour le code XeGregory,
    Punaise, j'y comprends rien! Qu'est qui cloche ?

    Je viens d'essayer avec un simple "dir" et là ça fonctionne parfaitement bien. Donc il y a une déclaration quelque part qui ne passe pas mais où ?

  6. #6
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 509
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    Nom : 2025-05-25_104734.jpg
Affichages : 174
Taille : 15,1 Ko

    Merci pour le code XeGregory,
    Punaise, j'y comprends rien! Qu'est qui cloche ?
    À mon avis, le souci provient de la variable d'environnement CreateProcess qui ne parvient pas à récupérer la variable d'environnement.

    Essaie pour voir si tu parviens à récupérer la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(GetEnvironmentVariable('Java'));

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/07/2021, 03h23
  2. Réponses: 8
    Dernier message: 19/07/2007, 16h40
  3. Réponses: 9
    Dernier message: 22/02/2007, 14h51
  4. Comment lancer une fonction présente sur une autre page ?
    Par mappy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2006, 14h44
  5. Réponses: 5
    Dernier message: 29/09/2006, 17h17

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