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

Free Pascal Discussion :

Une application console qui se substitue à une autre [Free Pascal]


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 163
    Billets dans le blog
    9
    Par défaut Une application console qui se substitue à une autre
    Bonjour ! J'essaie de résoudre le problème suivant.

    Soit une application console, Upper.exe, qui renvoie en majuscules tout ce qu'elle reçoit.

    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
    program Upper;
     
    uses
      SysUtils;
     
    var
      s: string;
     
    begin
      while not EOF do
      begin
        ReadLn(s);
     
        if s = 'quit' then
          Break
        else
          WriteLn(UpperCase(s));
      end;
    end.
    Soit une deuxième application, UpperInterface.exe, qui sera l'application effectivement utilisée par... l'utilisateur, et qui devra se comporter extérieurement comme Upper.exe, après l'avoir lancé.

    J'ai un code basé sur l'API Windows qui fait presque cela, sauf qu'il reste bloqué. Si je lance UpperInterface.exe et que je saisis quelque chose dans la console. Rien ne se passe. C'est lorsque j'appuie sur Ctrl+Z puis entrée que je vois apparaître la "réponse" de Upper.exe.

    Qu'est-ce que je dois faire ? Mettre le ReadLn dans un thread aussi ? Utiliser WaitForSingleObject, PeekNamedPipe, PeekConsoleInput... Je me perds dans tout ça.

    J'espère que j'ai été clair. Ci-joint le code des deux programmes. Voir plus loin un exemple qui fonctionne.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 163
    Billets dans le blog
    9
    Par défaut
    En fait c'est toujours le même problème que celui abordé dans cette vieille discussion. J'avais trouvé un programme en C qui faisait ce que je voulais. Je l'ai traduit en Pascal mais la version Pascal n'a jamais fonctionné.

    Je vais peut-être le faire en C, tout compte fait, mon programme.

  3. #3
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut Roland

    Si j'ai bien compris tu as un programme "UpperInterface.exe" lancé par ton programme de jeux d'echec (disons "Echec.exe") . "UpperInterface.exe" lance et doit récupérer les infos retournés par "Upper" et les renvoyés lui même dans "Echec.Exe" c'est bien ça ?

    As tu essayé de passer par TProcess ? cf https://www.developpez.net/forums/d1.../#post10167133

    A+

    [EDIT] sinon peut-être avec les composants IPC https://www.developpez.net/forums/d1.../#post10238316
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 163
    Billets dans le blog
    9
    Par défaut
    Bonjour Jérôme ! Oui tu as très bien compris mais pour ne pas compliquer les choses on peut faire abstraction d'Echec.exe. Là dans ce cas disons que c'est un simple utilisateur qui ouvre UpperInterface.exe, qui tape "bla" et UpperInterface.exe doit lui répondre "BLA".

    Merci pour les liens. Je vais les regarder.

    D'un autre côté comme j'ai un programme en C qui le fait, je me suis remis à étudier ce programme.

    Le problème sur lequel je bute, c'est d'écrire dans la console tout en laissant la possibilité à l'utilisateur d'entrer quelque chose. Enfin, c'est quelque chose comme ça.

  5. #5
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Voila j'ai fais un test vite fait, je pense que c'est plus ou moins ce que tu recherches

    ShareConsole.zip

    PS : pour UpperTool il faut le compiler sans débogage

    [EDIT] voici une variante fonctionnelle de Client :

    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
    program Client;
     
    {$mode objfpc}{$H+}
     
    {$IFDEF WINDOWS}
      {$APPTYPE CONSOLE} // Définition du type d'application
      {$CODEPAGE UTF-8}  // A rajouter sous Windows pour forcer le mode UTF-8 pour les chaînes de caractères en mode console
    {$ENDIF}
     
    uses
      {$IFDEF UNIX}{$IFDEF UseCThreads}
      cthreads,
      {$ENDIF}{$ENDIF}
      // Classes,
      SysUtils,  Process, Processutils //FileUtil,LConvEncoding,LazUTF8
      { you can add units after this };
     
    var
      UpperToolOutput : String;
     
    procedure ProcessOutput(Sender:TProcessEx; output:string);
    begin
      UpperToolOutput := Output; //ConsoleToUtf8(output);
    end;
     
    procedure ProcessError(Sender: TProcessEx; IsException: boolean);
    begin
      if IsException then
        UpperToolOutput := 'Erreur ! ' + Sender.ExceptionInfo
      else UpperToolOutput := 'Erreur inconnue ! ';
    end;
     
    var
      UserInput : String;
      cmdProcess : TProcessEx;
    begin
      WriteLn('Entrez quelque chose :');
      ReadLn(UserInput);
      try
        cmdProcess := TProcessEx.Create(nil);
        cmdProcess.ShowWindow := swoHIDE;
        cmdProcess.Executable := 'UpperTool' ;
        cmdProcess.Parameters.Add(UserInput);
        cmdProcess.OnError := @ProcessError;
        cmdProcess.OnOutput := @ProcessOutput;
        cmdProcess.Execute();
       // if ExecuteCommand('UpperTool '+UserInput, UpperToolOutput,false) <> 0 then UpperToolOutput := 'Erreur !';
      finally
         FreeAndNil(cmdProcess);
      end;
     
      Write('Réponse : '); writeln(UpperToolOutput);
      Readln;
     
     
    end.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 163
    Billets dans le blog
    9
    Par défaut
    Merci pour ton code Jérôme. Cette unité ProcessUtils a l'air intéressante.

    Mais ton exemple ne fait pas la même chose que le mien. Tu passes un paramètre à l'outil au moment où tu l'exécutes. Ça ne convient pas, parce que moi j'ai besoin de lui envoyer de nouvelles commandes à tout moment.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/04/2012, 13h09
  2. Réponses: 3
    Dernier message: 31/08/2010, 10h22
  3. [ADO] Application console qui essaye de se connecter à une base
    Par willos_fr dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/12/2007, 17h11
  4. Créer une application console
    Par darinze dans le forum Langage
    Réponses: 7
    Dernier message: 18/06/2004, 17h35
  5. [Kylix] une application console
    Par naili dans le forum EDI
    Réponses: 3
    Dernier message: 19/04/2004, 14h27

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