gpt4 book ai didi

delphi - 如何确定Windows安装程序是否忙于使用Delphi?

转载 作者:行者123 更新时间:2023-12-03 18:27:15 29 4
gpt4 key购买 nike

我有Windows服务,可以在特定事件中重新启动Windows,但是我有问题。使用Windows Installer安装程序时,我不想重新启动Windows。

因此,我如何确定Windows安装程序是否正在忙于安装某些东西。

任何Delphi或命令行功能都是可以接受的。

你能帮我吗?

我找到了这两个类,但我不知道如何使用它们。

Class1 class2

最佳答案

基于this article,这已经过时了,我尝试实现两个建议的选项。第二个在Windows 7 SP1上为我工作。原则是查询MSIServer服务状态并检查该服务是否正在运行并且接受SERVICE_ACCEPT_STOP控制代码。这是一个函数包装器:

uses
WinSvc;

function IsWindowsInstallerBusy: Boolean;
var
Service: SC_HANDLE;
ServiceMgr: SC_HANDLE;
ServiceStatus: SERVICE_STATUS;
begin
Result := False;

ServiceMgr := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
if ServiceMgr <> 0 then
try
Service := OpenService(ServiceMgr, 'MSIServer', SERVICE_QUERY_STATUS);
if Service <> 0 then
try
if QueryServiceStatus(Service, ServiceStatus) then
begin
Result := (ServiceStatus.dwCurrentState = SERVICE_RUNNING) and
((ServiceStatus.dwControlsAccepted and SERVICE_ACCEPT_STOP) = 0);
end
else
raise Exception.CreateFmt('Cannot query service status. Code: %d',
[GetLastError]);
finally
CloseServiceHandle(Service);
end
else
raise Exception.CreateFmt('Cannot open service. Code: %d',
[GetLastError]);
finally
CloseServiceHandle(ServiceMgr);
end
else
raise Exception.CreateFmt('Cannot connect to the service control ' +
'manager. Code: %d', [GetLastError]);
end;

关于delphi - 如何确定Windows安装程序是否忙于使用Delphi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21597298/

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