We help IT Professionals succeed at work.

How to start application with elevated status and wait for it to terminate?

light_bulb
light_bulb asked
on
446 Views
Last Modified: 2012-05-08
I'm trying to start another application from my program with elevated rights, and wait for it to terminate before continuing.

I've tried several different solutions on the web, but I can't find one that works exactly right.

The code below is the closest I have to working right. It runs the app with elevated privileges and waits for it to terminate, but it only works if I have a ShowMessage statement after calling the function below.  Otherwise, it doesn't make the host application wait at all.

The function and how I have to call it are below.  

Any ideas on how I can make this work without having to have the ShowMessage statement?


RunFileAsAdminWait(Handle, ExtractFilePath(Application.Exename) + 'name.exe', '/auto');
ShowMessage('');  
procedure TfMain.RunFileAsAdminWait(hWnd: HWND; aFile, aParameters: string);
var
  sei: TShellExecuteInfo;
  ExitCode: DWORD;
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;

Open in new window

Comment
Watch Question

Emmanuel PASQUIERFreelance Project Manager
CERTIFIED EXPERT
Top Expert 2010

Commented:
You should wait a little longer than 50 ms for your process to end. Try with 1000, or the value for infinite : INFINITE

WaitForSingleObject(sei.hProcess, 1000)   // wait 1s

WaitForSingleObject(sei.hProcess, INFINITE) // wait indefinetly


otherwise, if it needs a ShowMessage, then maybe it just need a little pause and message handling.
Application.ProcessMessages; might be enough.
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Emmanuel PASQUIERFreelance Project Manager
CERTIFIED EXPERT
Top Expert 2010

Commented:
excellent. That way your are sure to wait the end of it and still have response to user actions on your GUI.
If it doesn't work, then I don't know. You'll have to trace and tell us where it goes wrong.
Emmanuel PASQUIERFreelance Project Manager
CERTIFIED EXPERT
Top Expert 2010

Commented:
ah ,ok you found  it working.

Gain unlimited access to on-demand training courses with an Experts Exchange subscription.

Get Access
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Empower Your Career
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE

Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.