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