Delphi: обнаружение ожидающей перезагрузки (например, из Центра обновления Windows) - PullRequest
0 голосов
/ 02 марта 2019

Используя Delphi, есть ли способ проверить наличие ожидающей перезагрузки (например, из Центра обновления Windows)?

В своем исследовании я нашел способ сделать это с помощью C ++ ( здесь ), но она использует библиотеку, которую я не смог найти или найти эквивалент в Delphi.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Вы можете проверить наличие следующих двух разделов реестра:

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-битная программа может прочитать «настоящую» 64-битную версию реестра для получения информации о том, как это сделать из 32-битной программы.Более того, я считаю, что первый ключ ...\Component Based Servicing\RebootPending существует только в Vista / Server 2008 и более поздних версиях.

0 голосов
/ 03 марта 2019

Решение от Raymond Chen, с которым вы связались, может быть легко переведено на Delphi, хотя механизмы в Delphi имеют несколько разные имена и синтаксис.

Документация для 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...