gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:37:45 25 4
gpt4 key购买 nike

我正在尝试从我的程序中以提升的权限启动另一个应用程序,并等待它终止后再继续。

我在网上尝试了几种不同的解决方案,但找不到完全正确的解决方案。

下面的代码是我最接近正确工作的代码。它以提升的权限运行应用程序并等待其终止,但一旦外部应用程序终止,它就会卡住。换句话说,一旦启动的应用程序关闭,它就不会继续处理。

我怎样才能实现我在这里所追求的目标?

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, 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
if sei.hProcess <> 0 then
WaitForSingleObject(sei.hProcess, 50)
else
Exit;

CloseHandle(sei.hProcess);
end;

最佳答案

以下代码对我有用:

procedure 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_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 页面。结构。

关于Delphi:如何以提升的状态启动应用程序并等待其终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1717465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com