Execute a program and wait until it is done #17

The following function starts an executable with a given command line. If the execution fails (non-0 return value from executable), the return value is False, and GetLastError - $2000 is the return value from the executable. If the execution is successful (return value 0 from the executable), the return value is True.

function ExecAndWait(sExe, sCommandLine: string): Boolean;
var
  dwExitCode: DWORD;
  tpiProcess: TProcessInformation;
  tsiStartup: TStartupInfo;
begin
  Result := False;
  FillChar(tsiStartup, SizeOf(TStartupInfo), 0);
  tsiStartup.cb := SizeOf(TStartupInfo);
  if CreateProcess(PChar(fsExe), PChar(sCommandLine), nil, nil, False, 0,
    nil, nil, tsiStartup, tpi) then
  begin
    if WAIT_OBJECT_0 = WaitForSingleObject(tpiProcess.hProcess, INFINITE) then
    begin
      if GetExitCodeProcess(tpiProcess.hProcess, dwExitCode) then
      begin
        if dwExitCode = 0 then
          Result := True
        else
          SetLastError(dwExitCode + $2000);
      end;
    end;
    dwExitCode := GetLastError;
    CloseHandle(tpiProcess.hProcess);
    CloseHandle(tpiProcess.hThread);
    SetLastError(dwExitCode);
  end;
end;
You can find a similar routine named ExecAndWait in the DelphiDabbler Code Snippets Database. For more control over the executed program see the Console Application Runner Classes.
Author: Unknown
Added: 2007/06/02
Last updated: 2013/10/12