Собственно необходимо читать системный журнал виндовс "Приложения" нашел пример тут: 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.
|
|