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:
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
).
JwaPsApi:GetProcessImageFileName
ou QueryFullProcessImageNameA
en passant le Handle du TProcess pour retrouver ce nom de fichier ???