How can I execute a program and have my code wait until it is finished?

The next procedure allows you to execute a program and to wait until it's finished:

functionWinExecAndWait32(FileName: string; Visibility: Integer): dWord;
varzAppName: array[0..512] ofChar;
  zCurDir: array[0..255] ofChar;
  WorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
beginStrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.cb := Sizeof(StartupInfo);

  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  if notCreateProcess(nil,
           zAppName, { pointer to command line string }nil, { pointer to process security attributes }nil, { pointer to thread security attributes }false, { handle inheritance flag }CREATE_NEW_CONSOLE or{ creation flags }NORMAL_PRIORITY_CLASS,
           nil, { pointer to new environment block }nil, { pointer to current directory name }StartupInfo, { pointer to STARTUPINFO }ProcessInfo) thenResult := -1 { pointer to PROCESS_INF }else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end; end;

Delphi tip#50: to execute a program and wait a result