====== 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]]