====== TProcess et TProcessUTF8 ======
===== TProcess =====
Doc :
* [[https://wiki.freepascal.org/TProcess/fr| TProcess -> wiki.freepascal.org]]
* [[https://www.freepascal.org/docs-html/current/fcl/process/tprocess.html|TProcess ->freepascal.org]]
==== 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:
{{:prog:lazarus:classes:tproc1.png?direct|}}
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.
==== Procédure interessantes ====
=== Terminate ===
Function Terminate (AExitCode : Integer): Boolean; virtual;
...
Function TProcessnamemacro.Terminate(AExitCode : Integer) : Boolean;
begin
Result:=False;
If ExitStatus=Still_active then
Result:=TerminateProcess(Handle,AexitCode);
end;
Appel au final la fonction ''TerminateProcess'' de Windows
function TerminateProcess(hProcess:HANDLE; uExitCode:UINT):WINBOOL; external 'kernel32' name 'TerminateProcess';
D'aprés la [[https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess|Doc de TerminateProcess dans Windows]] le paramètre ''AExitCode'' est le code de sortie à utiliser par le processus et les threads terminés à la suite de cet appel.
==== 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 =====
* [[prog:lazarus:classes:tasyncprocess|Page de TAsyncProcess]]
* [[https://lazarus-ccr.sourceforge.io/docs/lcl/asyncprocess/tasyncprocess.html]]
====== Sources & Ressources======
* [[prog:lazarus:cas:processus:processus]] (Page locale)
* [[https://wiki.freepascal.org/Executing_External_Programs/fr|Executing External Programs/fr]]
* [[prog:lazarus:classes:tasyncprocess|Page de TAsyncProcess]]
* [[https://lazarus-ccr.sourceforge.io/docs/lcl/asyncprocess/tasyncprocess.html]]
* [[https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess|Doc TerminateProcess @ Windows]]