加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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()返回超时,我也将代码更改为循环.

有关标志的更多信息,请参阅SHELLEXECUTEINFO结构的MSDN页面.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读