Ha egy programot elindítunk a saját applikációnkból, az alábbi módon meg is várhatjuk annak befejezését.

function ExecAndWait(const Filename, Params: string):boolean;
{$IFDEF WIN32}
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  { Enclose filename in quotes to take care of long filenames with spaces. }
  CmdLine := Filename+' '+Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
   cb := SizeOf(SUInfo);
   dwFlags := STARTF_USESHOWWINDOW;
   wShowWindow := word(0);
  end;
  Result := CreateProcess(NIL, PChar(CmdLine), NIL, NIL, FALSE,
   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL,
   PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);
   { Wait for it to finish. }
   if Result then
   begin
    repeat
     application.ProcessMessages;
    until 0 = WaitForSingleObject(ProcInfo.hProcess, 10);
   { Clean up the handles. }
   CloseHandle(ProcInfo.hProcess);
   CloseHandle(ProcInfo.hThread);
  end;
{$ELSE}
var
  InstanceID : THandle;
  Buff: array[0..255] of char;
begin
  StrPCopy(Buff, Filename + ' ' + Params);
  InstanceID := WinExec(Buff, WindowState);
  if InstanceID < 32 then { a value less than 32 indicates an Exec error }
   Result := FALSE
  else begin
  Result := TRUE;
  repeat
   Application.ProcessMessages;
  until Application.Terminated;
end;
{$ENDIF}
END;

Megjegyzés:
Egy kicsit átjavítottam az eredeti példát, mert az mikor elindította az exe-t, akkor megfagyva várta a program befejeződését, a fenti példában már nem így van.
ExecAndWait('d:\nevezo.exe','');