Delphi:如何启动具有提升状态的应用程序并等待它终止?
发布时间:2020-12-15 10:09:42 所属栏目:大数据 来源:网络整理
导读:我试图从提升权限的程序开始另一个应用程序,并等待它继续之前终止. 我已经在网络上尝试了几种不同的解决方案,但是找不到正确的工作. 下面的代码是最接近我正确的工作.它以高级特权运行应用程序,并等待它终止,但一旦外部应用程序终止,它就会冻结.换句话说,一
我试图从提升权限的程序开始另一个应用程序,并等待它继续之前终止.
我已经在网络上尝试了几种不同的解决方案,但是找不到正确的工作. 下面的代码是最接近我正确的工作.它以高级特权运行应用程序,并等待它终止,但一旦外部应用程序终止,它就会冻结.换句话说,一旦启动的应用程序关闭,它不会继续处理. 我怎么能完成我在这之后呢? 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()返回超时,我也将代码更改为循环. 有关标志的更多信息,请参阅 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |