Ceci est une ancienne révision du document !


TProcess et TProcessUTF8

TProcess

Programme de démo (Ping)

Ce programme fait un Ping sur google.fr et affiche le résultat dans un TMemo

procedure TForm1.Ping;
var
   vProc: TProcess;
begin
   vProc := TProcess.Create(nil);
   try
      // Nom de l'executable
      vProc.Executable := 'ping';
      // Ajout des parametres
      vProc.Parameters.Add('google.fr');
      // Ci dessous : poUsePipe trés important pour utiliser vProc.Output, sinon BUG !
      vProc.Options := vProc.Options + [poWaitOnExit, poUsePipes];
      vProc.Execute;
 
      // Affichage du résultat dans un TMemo
      Memo.Lines.LoadFromStream(vProc.Output);
 
   finally
      vProc.Free;
   end;
end;

Résultat:

source compléte :

unit uMain;
 
{$mode objfpc}{$H+}
 
interface
 
uses
   Classes,   Controls,   Dialogs,   Forms,   Graphics,   StdCtrls,   process,   SysUtils;
 
type
    { TForm1 }
 
   TForm1 = class(TForm)
      Button1:   TButton;
      GroupBox1: TGroupBox;
      Memo:      TMemo;
      procedure Button1Click(Sender: TObject);
   private
      procedure Ping;
   public
 
   end;
 
var
   Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Ping;
end;
 
procedure TForm1.Ping;
var
   vProc: TProcess;
begin
   vProc := TProcess.Create(nil);
   try
 
      // Nom de l'executable
      vProc.Executable := 'ping';
 
      // Ajout des parametres
      vProc.Parameters.Add('google.fr');
 
      // Ci dessous : poUsePipe trés important pour utiliser vProc.Output, sinon BUG !
      vProc.Options := vProc.Options + [poWaitOnExit, poUsePipes];
      vProc.Execute;
 
      // Affichage du résultat dans un TMemo
      Memo.Lines.LoadFromStream(vProc.Output);
 
   finally
      vProc.Free;
   end;
end;
 
end.

TProcessOptions

poRunSuspended

Start the process in suspended state.

poWaitOnExit

Wait for the process to terminate before returning.

poUsePipes

Utilisez les pipes pour rediriger les entrées et sorties standard.

Utiliser cette option si l'on veut récupérer le texte généré par l'application.

poStderrToOutPut

Redirect standard error to the standard output stream.

poNoConsole

Ne pas autoriser l'accès à la fenêtre de la console pour le processus (Win32 uniquement).
N'affiche pas la console.

poNewConsole

Start a new console window for the process (Win32 only)

poDefaultErrorMode

Use default error handling.

poNewProcessGroup

Start the process in a new process group (Win32 only)

poDebugProcess

Allow debugging of the process (Win32 only)

poDebugOnlyThisProcess

Do not follow processes started by this process (Win32 only)

poDetached

ToDo !!!

poPassInput

Pass standard input handle on to new process

poRunIdle

ToDo!!!

TProcessUTF8

En examinant la déclaration de TProcessUTF8 (ci-dessous) on constate que cette classe ajoute juste une nouvelle procédure à TProcess : La procédure ParseCmdLine.

Toujours en examinant le code on constate que TProcessUTF8 avait beaucoup plus de fonctions avec une ancienne version du Compilateur FreePascal FPC_FULLVERSION < 30200

  TProcessUTF8 = class(TProcess)
  public
    procedure ParseCmdLine(const CmdLine: string; ReadBackslash: boolean = false);
  end;

L'unité UTF8Process contient les functions suivantes :

function FindFilenameOfCmd(ProgramFilename: string): string;
function GetSystemThreadCount: integer; 
procedure RunCmdFromPath(ProgramFilename, CmdLineParameters: string);

TAsyncProcess

Astuces

Trouver le filename complet d'une commande

Exemple : trouver le filename complet de la commande php.

Grâce a la fonction FindFilenameOfCmd(ProgramFilename: string): string qui se trouve dans l'unit UTF8Process (voir ci-dessus)

FindFilenameOfCmd('php')C:\Program Files\php\php-7.3.6\php.exe

Cette fonction utilise les fonctions suivantes : fileutil:FindDefaultExecutablePath qui parcours tous les PATHs a la recherche de ce fichier (grâce à fileutil:SearchFileInPath).

N'aurait t'il pas été plus facile d'utiliser JwaPsApi:GetProcessImageFileName ou QueryFullProcessImageNameA en passant le Handle du TProcess pour retrouver ce nom de fichier ???

Sources et Ressources

Vous pourriez laisser un commentaire si vous étiez connecté.