Delphi - Visualizar Visor de sucesos NT-2000

 
Vista:

Visualizar Visor de sucesos NT-2000

Publicado por mikel (3 intervenciones) el 17/06/2005 16:58:29
Hola,

el procedimiento siguiente junto con otras funciones hace una consulta al visor de sucesos de NT o 2000 y los vuelque en un memo.

Hasta aquí perfecto. El problema es que cada vez que ejecuto este procedimiento veo que la memoria virtual del sistema incrementa X KBytes hata producirse lo que llaman un lack memory.

No sé que puedo hacer para que esto no suceda , sospecho en la función Getmem pero no parece que sea este el problema. De lo que sí confío es en la gente de este foro en que me puede hechar un cable.

Muchas gracias por todo. esper aprender mucho y poderos ayudar algún día.

Aquí os pego el procedimiento:

procedure TForm1.check_events(Sender: TObject);
var

fecha:string;
begin
if ( (timetostr(time) <hora_fin) and (timetostr(time) >hora_comienzo) ) then
begin
dwBytesRead := 0;
dwBytesNeed := 0;

fecha:= datetostr(date);
while Pos('/', fecha) > 0 do
fecha[Pos('/', fecha)]:=' ';

hEventLog := OpenEventLog(PCHAR(getcomputername), PChar('ERROR'));
if hEventLog = 0 then
raise Exception.Create(SysErrorMessage(GetLastError));

if not GetNumberOfEventLogRecords(hEventLog, dwEventLogRecords) then
dwEventLogRecords := 1024;

dwBufSize := 128*1024;
GetMem(EventLogPtr, dwBufSize);

lpBuffer := EventLogPtr;

memo9.Clear;

try
while ReadEventLog(hEventLog, EVENTLOG_FORWARDS_READ or EVENTLOG_SEQUENTIAL_READ, 0, EventLogPtr, dwBufSize, dwBytesRead, dwBytesNeed) do
begin
while dwBytesRead > 0 do
begin
with TEventLog(lpBuffer^) do
begin
EventLogRecord := TEventLogRecord.Create;
EventLogRecord.EventType := EventType;
EventLogRecord.TimeGenerated := UnixDateTimeToDelphiDateTime(TimeGenerated);
EventLogRecord.SourceName := PChar(DWORD(lpBuffer)+DWORD(SizeOf(TEventLog)));
EventLogRecord.EventCategory := EventCategory;
EventLogRecord.EventID := EventID;

if TEventLog(lpBuffer^).UserSIDLength > 0 then
EventLogRecord.UserName := GetAccountName(PSID(DWORD(lpBuffer) + DWORD(TEventLog(lpBuffer^).UserSIDOffset)))
else
EventLogRecord.UserName := '(blank)';
EventLogRecord.ComputerName := PChar(DWORD(lpBuffer)+DWORD(SizeOf(TEventLog)+System.Length(EventLogRecord.SourceName)+1));
FirstArgument := PChar(DWORD(lpBuffer)+DWORD(StringOffset));
iNumStrings := TEventLog(lpBuffer^).NumStrings;
SetLength(ArgsBuffer, iNumStrings);

try

dwArgumentOffset := DWORD(StrLen(FirstArgument)+1);
ArgsBuffer[0] := FirstArgument;

for i := 1 to iNumStrings-1 do
begin
NextArgument := PChar(DWORD(lpBuffer)+DWORD(StringOffset)+dwArgumentOffset);
ArgsBuffer[i] := NextArgument;
dwArgumentOffset := dwArgumentOffset + StrLen(NextArgument) + 1;
end;
except
SetLength(ArgsBuffer, 1);
ArgsBuffer[0] := '';
end;

EventMessageFile := PChar(GetRegValue(HKEY_LOCAL_MACHINE,
'SYSTEM\CurrentControlSet\Services\EventLog\Application\'+EventLogRecord.SourceName, 'EventMessageFile'));
FillChar(OutputStr, SizeOf(OutputStr), 0);
ExpandEnvironmentStrings(EventMessageFile, OutputStr, SizeOf(OutputStr));
if OutputStr <> EventMessageFile then
EventMessageFile := OutputStr;

hModule := LoadLibraryEx(PChar(EventMessageFile), 0, DONT_RESOLVE_DLL_REFERENCES);
FillChar(lpMsgBuf, SizeOf(lpMsgBuf), 0);
if hModule <> 0 then
try

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER or
FORMAT_MESSAGE_FROM_HMODULE or
FORMAT_MESSAGE_FROM_SYSTEM or
FORMAT_MESSAGE_ARGUMENT_ARRAY,
Pointer(hModule),
EventLogRecord.EventID,
0,
PChar(@lpMsgBuf), SizeOf(lpMsgBuf), ArgsBuffer);
finally
FreeLibrary(hModule);
ArgsBuffer := nil;
end;

EventLogRecord.Description := lpMsgBuf;
lpMsgBuf := nil;

EventLogRecord.RecordNumber := RecordNumber;

Application.ProcessMessages;
if uppercase(EventTypeToStr(EventType))='ERROR' then
begin
memo9.Lines.Add(EventTypeToStr(EventType));
memo9.Lines.Add(DATETIMETOSTR(EventLogRecord.TimeGenerated ));
memo9.Lines.Add(EventLogRecord.description);
memo9.Lines.Add(EventLogRecord.ComputerName);
end;

end;

dwBytesRead := dwBytesRead - TEventLog(lpBuffer^).Length;
lpBuffer := PEventLog(DWORD(lpBuffer) + TEventLog(lpBuffer^).Length);
end;

lpBuffer := EventLogPtr;
end;
finally
FreeMem(EventLogPtr);
CloseEventLog(hEventLog);
end;
try
begin
memo9.Lines.SaveToFile(path+'\'+centro+'\evets_'+GetComputerName+'_'+fecha+'.log');
end;
except
end;


end;

end;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder