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;