Recherche…


CreateProcess

La fonction suivante encapsule le code d'utilisation de l'API Windows CreateProcess pour lancer d'autres programmes.

Il est configurable et peut attendre que le processus d'appel se termine ou qu'il revienne immédiatement.

Paramètres:

  • FileName - chemin d'accès complet à l'exécutable
  • Params - paramètres de ligne de commande ou utiliser une chaîne vide
  • Folder - dossier de travail pour le programme appelé - si le chemin vide sera extrait de FileName
  • WaitUntilTerminated - si la fonction true attendra que le processus termine son exécution
  • WaitUntilIdle - si la fonction true appelle la fonction WaitForInputIdle et attend que le processus spécifié ait fini de traiter son entrée initiale et jusqu'à ce qu'il n'y ait plus de saisie utilisateur en attente
  • RunMinimized - si le vrai processus sera exécuté minimisé
  • ErrorCode - si la fonction échoue, cela contiendra le code d'erreur Windows rencontré
function ExecuteProcess(const FileName, Params: string; Folder: string; WaitUntilTerminated, WaitUntilIdle, RunMinimized: boolean;
  var ErrorCode: integer): boolean;
var
  CmdLine: string;
  WorkingDirP: PChar;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  Result := true;
  CmdLine := '"' + FileName + '" ' + Params;
  if Folder = '' then Folder := ExcludeTrailingPathDelimiter(ExtractFilePath(FileName));
  ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  StartupInfo.cb := SizeOf(StartupInfo);
  if RunMinimized then
    begin
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_SHOWMINIMIZED;
    end;
  if Folder <> '' then WorkingDirP := PChar(Folder)
  else WorkingDirP := nil;
  if not CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil, WorkingDirP, StartupInfo, ProcessInfo) then
    begin
      Result := false;
      ErrorCode := GetLastError;
      exit;
    end;
  with ProcessInfo do
    begin
      CloseHandle(hThread);
      if WaitUntilIdle then WaitForInputIdle(hProcess, INFINITE);
      if WaitUntilTerminated then
        repeat
          Application.ProcessMessages;
        until MsgWaitForMultipleObjects(1, hProcess, false, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 + 1;
      CloseHandle(hProcess);
    end;
end;

Utilisation de la fonction ci-dessus

var
  FileName, Parameters, WorkingFolder: string;
  Error: integer;
  OK: boolean;
begin
  FileName := 'C:\FullPath\myapp.exe';
  WorkingFolder := ''; // if empty function will extract path from FileName
  Parameters := '-p'; // can be empty 
  OK := ExecuteProcess(FileName, Parameters, WorkingFolder, false, false, false, Error);
  if not OK then ShowMessage('Error: ' + IntToStr(Error));
end;

Documentation CreateProcess



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow