Zoeken…


CreateProcess

De volgende functie bevat code voor het gebruik van CreateProcess Windows API voor het starten van andere programma's.

Het is configureerbaar en kan wachten tot het oproepproces is voltooid of onmiddellijk terugkeren.

parameters:

  • FileName - volledig pad naar uitvoerbaar
  • Params - opdrachtregelparameters of gebruik een lege string
  • Folder - werkmap voor opgeroepen programma - als een leeg pad wordt geëxtraheerd uit FileName
  • WaitUntilTerminated - als de echte functie wacht tot het proces is WaitUntilTerminated
  • WaitUntilIdle - als de true-functie de functie WaitForInputIdle aanroept en wacht totdat het opgegeven proces de eerste invoer heeft verwerkt en totdat er geen gebruikersinvoer in behandeling is
  • RunMinimized - als het ware proces minimaal wordt uitgevoerd
  • ErrorCode - als de functie mislukt, bevat dit de Windows Error Code
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;

Gebruik van bovenstaande functie

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-documentatie



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow