Показать сообщение отдельно
  #9  
Старый 08.12.2015, 10:09
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

Цитата:
Сообщение от Romix
http://www.delphisources.ru/forum/sh...ad.php?t=26956

Вот. Когда то мне помогли.

Спасибо, примеры интересные.
Но в этом примере я не пойму, что вообще программа делает:
Код:
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
 
 
procedure  GetLogEvents;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT Category,ComputerName,EventCode,Message,RecordNumber FROM Win32_NTLogEvent '+
                                         'Where Logfile="System" and EventCode=1','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Category          %s',[String(FWbemObject.Category)]));
    Writeln(Format('Computer Name     %s',[String(FWbemObject.ComputerName)]));
    Writeln(Format('EventCode         %d',[Integer(FWbemObject.EventCode)]));
    Writeln(Format('Message           %s',[String(FWbemObject.Message)]));
    Writeln(Format('RecordNumber      %d',[Integer(FWbemObject.RecordNumber)]));
    FWbemObject:=Unassigned;
  end;
end;
 
begin
 try
    CoInitialize(nil);
    try
      GetLogEvents;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.

Вроде выводит новые события (хотя не уверен).
а тут ругается уже на PEVENTLOGRECORD. :

Код:
var
  hEventLog: THandle;
  NumberOfRecords: DWORD;
  Buffer: PEVENTLOGRECORD;
  BytesRead, MinNumberOfBytesNeeded: DWORD;
begin
  Memo1.Lines.BeginUpdate;
  try
    hEventLog:=OpenEventLog(nil, 'SYSTEM');
    if hEventLog=0 then RaiseLastOSError;
    if GetNumberOfEventLogRecords(hEventLog, NumberOfRecords) then Memo1.Lines.Add('NumberOfRecords = '+IntToStr(NumberOfRecords));
    Buffer:=GetMemory($10000);
    while True do
    begin
      if not ReadEventLog(hEventLog, EVENTLOG_SEQUENTIAL_READ or EVENTLOG_BACKWARDS_READ, 0, Buffer, 0, BytesRead, MinNumberOfBytesNeeded) then
      begin
        if GetLastError<>ERROR_INSUFFICIENT_BUFFER then Break;
        if not ReadEventLog(hEventLog, EVENTLOG_SEQUENTIAL_READ or EVENTLOG_BACKWARDS_READ, 0, Buffer, MinNumberOfBytesNeeded, BytesRead, MinNumberOfBytesNeeded) then Break;
        if PChar(Integer(Buffer)+SizeOf(EVENTLOGRECORD))='Microsoft-Windows-Kernel-General' then
        begin
          if Buffer^.EventID in [12, 13] then
            Memo1.Lines.Add('RecordNumber = '+IntToStr(Buffer^.RecordNumber)+' '+PChar(Integer(Buffer)+SizeOf(EVENTLOGRECORD))+' TimeGenerated = '+DateTimeToStr(UnixToDateTime(Buffer^.TimeGenerated))+' EventID = '+IntToStr(Buffer^.EventID));
        end;
      end else Break;
    end;
    FreeMemory(Buffer);
    CloseEventLog(hEventLog);
  finally
    Memo1.Lines.EndUpdate;
  end;
end;

Кто-нибудь может мне коментарии написать? а то я, видать совсем дуб

P.S.: Кстати, не по теме, на форуме спойлеры есть?
Ответить с цитированием