Delphi:如何启动具有提升状态的应用程序并等待它终止?

前端之家收集整理的这篇文章主要介绍了Delphi:如何启动具有提升状态的应用程序并等待它终止?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从提升权限的程序开始另一个应用程序,并等待它继续之前终止.

我已经在网络上尝试了几种不同的解决方案,但是找不到正确的工作.

下面的代码是最接近我正确的工作.它以高级特权运行应用程序,并等待它终止,但一旦外部应用程序终止,它就会冻结.换句话说,一旦启动的应用程序关闭,它不会继续处理.

我怎么能完成我在这之后呢?

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页面.

原文链接:https://www.f2er.com/delphi/102701.html

猜你在找的Delphi相关文章