Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Чтение системного журнала


Автор: Zlo 3.7.2011, 03:31
Собственно необходимо читать системный журнал виндовс "Приложения"
нашел пример тут: http://forum.codenet.ru/threads/47838-%D0%A7%D1%82%D0%B5%D0%BD%D0%B8%D0%B5-EventLog
переделал под себя, но есть две проблемы
1.В мемо выводится самое первое событие потом через 100+ следующее событие и т.д.
Никак не могу понять посему он не хочет пихать их в мемо попорядку?
2.Нужно также выводить поле DataOffset, но как это сделать не могу понять, как никрутился ругается на доступ к памяти?

Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type

  TForm2 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
TEventLogRecord = record
Length: dword;
Reserved: dword;
RecordNumber: dword;
TimeGenerated: dword;
TimeWritten:dword;
EventID: dword;
EventType: word;
NumStrings: word;
EventCategory: word;
ReservedFlags: word;
ClosingRecordNumber: dword;
StringOffset: dword;
UserSidLength: dword;
UserSidOffset: dword;
DataLength: dword;
DataOffset: dword;
end;
PTEventLogRecord = ^TEventLogRecord;
var
  Form2: TForm2;

  const
// Sets UnixStartDate to TDateTime of 01/01/1970
  UnixStartDate: TDateTime = 25569.0;
implementation

{$R *.dfm}
function UnixToDateTime(USec: Longint): TDateTime;
 begin
   //Example: UnixToDateTime(1003187418);
  Result := (Usec / 86400) + UnixStartDate;
 end;

procedure TForm2.Button1Click(Sender: TObject);
var
h, dwread, dwneeded: dword;
p, src:pointer;
b:PTEventLogRecord;
s:string;
i,j:integer;
begin
    h:=OpenEventLog(nil, PChar('Application'));
    if h<>INVALID_HANDLE_VALUE then
    begin
      p:=AllocMem(1024*64);
      src:=p;
for I := 0 to 100 - 1 do
begin
ReadEventLog(h, 8 or 1, 0, p, 1024*64, dwread, dwneeded);
b:=p;
s:='record number: '+IntToStr(b^.RecordNumber)+#13#10 +'source: '+PChar(integer(b)+sizeof(TEventLogRecord))+#13#10 + ' event id: ' + IntToHex(b^.EventID,8) +#13#10 + ' event type: '+IntToStr(b^.EventType)+#13#10+'TimeGenerated: '+DateTimeToStr(UnixToDateTime(b^.TimeGenerated));
Memo1.Lines.Add(s);
dwread:=dwread-b^.Length;
p:=pointer(integer(p)+b^.Length);
p:=src;

end;
ZeroMemory(p, 1024*64);
FreeMem(src);
CloseEventLog(h);

end;
end;

end.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)