Delphi: Como iniciar o aplicativo com status elevado e esperar que ele termine?

Estou tentando iniciar outro aplicativo do meu programa com direitos elevados e aguarde que ele termine antes de continuar.

Já experimentei várias soluções diferentes na Web, mas não consigo encontrar uma que funcione corretamente.

O código abaixo é o mais próximo que eu tenho de trabalhar direito. Ele executa o aplicativo com privilégios elevados e aguarda que ele termine, mas congela quando o aplicativo externo é encerrado. Em outras palavras, ele não continua sendo processado depois que o aplicativo iniciado é fechado.

Como posso realizar o que estou procurando aqui?

procedure TfMain.RunFileAsAdminWait(hWnd: HWND; aFile, aParameters: string);
var
  sei: TShellExecuteInfo;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.Wnd := hWnd;
  sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
  sei.lpVerb := 'runas';
  sei.lpFile := PChar(aFile);
  sei.lpParameters := PChar(aParameters);
  sei.nShow := SW_SHOWNORMAL;

  if not ShellExecuteEx(@sei) then
    RaiseLastOSError
  else
    while WaitForSingleObject(sei.hProcess, 50) <> WAIT_OBJECT_0 do
      Application.ProcessMessages;

  CloseHandle(sei.hProcess);
end;

Atualizar:

Eu criei a seguinte função, mas só funciona se eu tiver uma declaração ShowMessage depois de chamá-la. Então eu tenho que ter:

RunFileAsAdminWait(Handle, ExtractFilePath(Application.Exename) + 'AutoUpdate.exe', '/auto');
ShowMessage('test');

para fazer a função funcionar.Como posso fazer isso funcionar sem a chamada ShowMessage?

Aqui está a função atualizada:

procedure TfMain.RunFileAsAdminWait(hWnd: HWND; aFile, aParameters: string);
var
  sei: TShellExecuteInfo;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.Wnd := hWnd;
  sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
  sei.lpVerb := 'runas';
  sei.lpFile := PChar(aFile);
  sei.lpParameters := PChar(aParameters);
  sei.nShow := SW_SHOWNORMAL;

  if not ShellExecuteEx(@sei) then
    RaiseLastOSError
  else
    if sei.hProcess <> 0 then
      WaitForSingleObject(sei.hProcess, 50)
    else
      Exit;

  CloseHandle(sei.hProcess);
end;

questionAnswers(3)

yourAnswerToTheQuestion