Delphi function for wait until an external process has completed

function ShellExecute_AndWait(const FileName: string; const Params: string): bool;

var

  exInfo: TShellExecuteInfo;

  Ph: DWORD;

begin


  FillChar(exInfo, SizeOf(exInfo), 0);

  with exInfo do

  begin

    cbSize := SizeOf(exInfo);

    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;

    Wnd := GetActiveWindow();

    exInfo.lpVerb := 'open';

    exInfo.lpParameters := PChar(Params);

    lpFile := PChar(FileName);

    nShow := SW_HIDE;

  end;

  if ShellExecuteEx(@exInfo) then

    Ph := exInfo.hProcess

  else

  begin

    ShowMessage(SysErrorMessage(GetLastError));

    Result := true;

    exit;

  end;

  while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do

    Application.ProcessMessages;

  CloseHandle(Ph);


  Result := true;

end;