Suche…


CreateProcess

Die folgende Funktion kapselt Code für die Verwendung von CreateProcess Windows API zum Starten anderer Programme.

Es ist konfigurierbar und kann warten, bis der aufrufende Prozess abgeschlossen ist oder sofort zurückkehrt.

Parameter:

  • FileName - vollständiger Pfad zur ausführbaren Datei
  • Params - Befehlszeilenparameter oder leere Zeichenfolge verwenden
  • Folder - Arbeitsordner für das aufgerufene Programm - wenn aus FileName leerer Pfad extrahiert FileName
  • WaitUntilTerminated - wenn die Funktion true wartet, bis der Prozess die Ausführung beendet hat
  • WaitUntilIdle - Wenn die Funktion true die Funktion WaitForInputIdle aufruft , und warten, bis der angegebene Prozess die Verarbeitung seiner ursprünglichen Eingabe abgeschlossen hat und keine Benutzereingaben vorliegen
  • RunMinimized - wenn der Prozess "True" minimiert ausgeführt wird
  • ErrorCode - Wenn die Funktion fehlschlägt, enthält sie den gefundenen Windows-Fehlercode
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;

Verwendung der obigen Funktion

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;

CreateProcess-Dokumentation



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow