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.

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é.