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;