![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Перечислить измененные ключи реестра в определенный диапазон времениDelphi , ОС и Железо , РеестрПеречислить измененные ключи реестра в определенный диапазон времени
Оформил: DeeCo unit Main; interface uses Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls, ComCtrls, ExtCtrls; type TFrmMain = class(TForm) Memo1: TMemo; btEnumReg: TButton; dtBeginDate: TDateTimePicker; dtEndDate: TDateTimePicker; dtBeginTime: TDateTimePicker; dtEndTime: TDateTimePicker; Panel1: TPanel; Label1: TLabel; Label2: TLabel; procedure btEnumRegClick(Sender: TObject); private { Private declarations } RegDate: TDateTime; RegKeyInfo: TRegKeyInfo; TimeZoneInfo: TTimeZoneInformation; function DateTimeToLocalDateTime(DateTime: TDateTime): TDateTime; procedure FileTimeToDateTime(ft: TFileTime; var dt: TDateTime); public { Public declarations } end; var FrmMain: TFrmMain; implementation {$R *.dfm} function TFrmMain.DateTimeToLocalDateTime(DateTime: TDateTime): TDateTime; begin case GetTimeZoneInformation(TimeZoneInfo) of TIME_ZONE_ID_STANDARD: Result := DateTime - (TimeZoneInfo.Bias / 60 / 24); TIME_ZONE_ID_DAYLIGHT: Result := DateTime - ((TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias) / 60 / 24); else Result := 0; end; end; procedure TFrmMain.FileTimeToDateTime(ft: TFileTime; var dt: TDateTime); var SystemTime: TSystemTime; FileTime: TFileTime; begin if FileTimeToLocalFileTime(ft, FileTime) then begin FileTimeToSystemTime(ft, SystemTime); dt := SystemTimeToDateTime(SystemTime); end; end; procedure TFrmMain.btEnumRegClick(Sender: TObject); var Inizio, Fine: TDateTime; procedure EnumAllKeys(hkey: THandle; KeyName: string); var l: TStringList; n: Integer; KeyName_: string; begin KeyName_ := KeyName; with TRegistry.Create do try RootKey := hkey; OpenKey(EmptyStr, False); l := TStringList.Create; try GetKeynames(l); CloseKey; for n := 0 to l.Count - 1 do begin if OpenKey(l[n], False) then begin GetKeyInfo(RegKeyInfo); with RegKeyInfo do begin FileTimeToDateTime(FileTime, RegDate); RegDate := DateTimeToLocalDateTime(RegDate); end; if (RegDate <= Fine) and (RegDate >= Inizio) then memo1.Lines.Add(DateTimeToStr(RegDate) + ' --- ' + KeyName_ + '\' + l[n]); EnumAllKeys(CurrentKey, KeyName_ + '\' + l[n]); CloseKey; end; end; finally l.Free end; finally Free; end; end; begin Memo1.Clear; Memo1.Lines.BeginUpdate; Inizio := int(dtBeginDate.DateTime) + frac(dtBeginTime.DateTime); Fine := int(dtEndDate.Date) + frac(dtEndTime.DateTime); try EnumAllKeys(HKEY_CURRENT_USER, 'HKey_Current_User'); finally Memo1.Lines.EndUpdate; end; MessageDlg('Enumeration ended', mtInformation, [mbOK], 0); end; end. Программное приложение на Delphi, которое перечисляет измененные ключи в Windows-регистре в указанном временном диапазоне. Оно выполняет следующие действия:
Код использует несколько функций Windows API, таких как Вот предложенная альтернативная решение: Вместо использования рекурсивных функций вызовов, можно использовать подход на основе стека для перечисления ключей. Это будет более эффективно и менее уязвимо для переполнения стека при работе с более крупными регистрами. Кроме того, вам может быть полезно добавить обработку ошибок для случаев, когда операции с регистром неудачны или временной диапазон недействителен. Перечислить измененные ключи реестра в определенный диапазон времени: программа на Delphi для отображения истории изменений в реестре Windows с указанием даты и времени изменения. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |