Delphi:检测挂起的重新启动(例如从Windows Update)

时间:2019-03-02 20:35:08

标签: delphi detection reboot

使用Delphi,有没有办法检查挂起的重启(例如从Windows Update)?

在我的研究中,我看到了一种使用C ++(here)来实现此目的的方法,但是它使用的库无法在Delphi中找到或查找等效项。

2 个答案:

答案 0 :(得分:7)

您所链接的来自Raymond Chen的解决方案可以轻松转换为Delphi,尽管Delphi中的机制名称和语法略有不同。

documentation for ISystemInformation说:

  

您可以使用 SystemInformation 协同类创建此接口的实例。使用 Microsoft.Update.SystemInfo 程序标识符创建对象。

一个例子:

program CheckRebootRequired;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, Winapi.ActiveX, System.Win.ComObj, System.Variants;

procedure Main;
var
  SysInfo: OleVariant;
  RebootRequired: OleVariant;
begin
  SysInfo := CreateOleObject('Microsoft.Update.SystemInfo');
  if not VarIsNull(SysInfo) then
  begin
    RebootRequired := SysInfo.RebootRequired;
    Writeln('Reboot required = ', RebootRequired);
  end
  else
    Writeln('Could not get Update SystemInfo');
end;

begin
  CoInitialize(nil);
  try
    try
      Main;
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    CoUninitialize;
  end;
  Readln;
end.

答案 1 :(得分:2)

您可以检查是否存在以下两个注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired

或注册表值

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

如果这些键/值中的任何一个存在,则重新引导将挂起。请注意,在64位Windows安装上,您应该查询64位注册表。有关如何通过32位程序执行此操作的信息,请参见How can a 32-bit program read the “real” 64-bit version of the registry。此外,我相信第一个键...\Component Based Servicing\RebootPending仅存在于Vista / Server 2008及更高版本中。