Delphi: Wie starte ich eine Anwendung mit erhöhtem Status und warte, bis sie beendet ist?

Ich versuche, eine andere Anwendung mit erhöhten Rechten von meinem Programm aus zu starten und zu warten, bis sie beendet ist, bevor ich fortfahre.

Ich habe verschiedene Lösungen im Web ausprobiert, finde aber keine, die genau richtig funktioniert.

Der folgende Code ist der Code, der meiner Arbeit am nächsten kommt. Es führt die App mit erhöhten Rechten aus und wartet darauf, dass sie beendet wird, friert jedoch ein, sobald die externe App beendet wird. Mit anderen Worten, die Verarbeitung wird nicht fortgesetzt, sobald die gestartete App geschlossen wird.

Wie kann ich erreichen, wonach ich hier strebe?

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;

Aktualisieren:

Ich habe mir die folgende Funktion ausgedacht, aber sie funktioniert nur, wenn ich nach dem Aufruf eine ShowMessage-Anweisung habe. Also muss ich haben:

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

um die Funktion zum Laufen zu bringen.Wie kann ich es ohne den ShowMessage-Aufruf zum Laufen bringen?

Hier ist die aktualisierte Funktion:

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;

Antworten auf die Frage(3)

Ihre Antwort auf die Frage