我试图从提升权限的程序开始另一个应用程序,并等待它继续之前终止.
我已经在网络上尝试了几种不同的解决方案,但是找不到正确的工作.
下面的代码是最接近我正确的工作.它以高级特权运行应用程序,并等待它终止,但一旦外部应用程序终止,它就会冻结.换句话说,一旦启动的应用程序关闭,它不会继续处理.
我怎么能完成我在这之后呢?
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;
更新:
我已经提出了以下功能,但它只有在调用它之后有一个ShowMessage语句才有用.所以,我必须有:
RunFileAsAdminWait(Handle,ExtractFilePath(Application.Exename) + 'AutoUpdate.exe','/auto'); ShowMessage('test');
以使功能发挥作用.没有ShowMessage调用,我该如何使其工作?
这是更新的功能:
procedure TfMain.RunFileAsAdminWait(hWnd: HWND; aFile,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;
解决方法
以下代码适用于我:
procedure RunFileAsAdminWait(hWnd: HWND; aFile,0); sei.cbSize := SizeOf(sei); sei.Wnd := hWnd; sei.fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS; sei.lpVerb := 'runas'; sei.lpFile := PChar(aFile); sei.lpParameters := PChar(aParameters); sei.nShow := SW_SHOWNORMAL; if not ShellExecuteEx(@sei) then RaiseLastOSError; if sei.hProcess <> 0 then begin while WaitForSingleObject(sei.hProcess,50) = WAIT_TIMEOUT do Application.ProcessMessages; CloseHandle(sei.hProcess); end; end;
您必须传递SEE_MASK_NOCLOSEPROCESS标志以获取进程句柄等待.只要WaitForSingleObject()返回超时,我也将代码更改为循环.
有关标志的更多信息,请参阅SHELLEXECUTEINFO
结构的MSDN页面.