Hallo,
Ich habe folgende WMI Abfrage, die an sich sehr gut funktioniert. Aber wenn das Ereignislog zu gross ist, dann bekomm ich in der "aObjSet := aSrv.ExecQuery("-Zeile einen Fehler, dass der Arbeitsspeicher zu klein ist. Was kann ich tun ?
procedure CreateEventListForService (Host, User, Pwd : String; VAR EventListItems : TListItems; SourceName : String);
VAR
aLoc : ISWbemLocator;
aSrv : ISWbemServices;
aObjSet : ISWbemObjectSet;
pEnum : IEnumVARIANT;
vOut : OleVariant;
dwRetrieved : LongWord;
hRes : HResult;
s : String;
act_ListItem : TListItem;
x : integer;
begin
aLoc := CoSWbemLocator.Create;
aSrv := aLoc.ConnectServer(Host,'',User,Pwd,'','',0, nil);
aSrv.Security_.ImpersonationLevel := wbemImpersonationLevelImpersonate;
aObjSet := aSrv.ExecQuery('SELECT EventType, Message, TimeGenerated, InsertionStrings ' +
'FROM Win32_NTLogEvent WHERE Logfile="Application" AND SourceName="' + SourceName + '"',
'WQL', 0, nil);
pEnum := aObjSet.Get__NewEnum as IEnumVARIANT;
while (TRUE) do
begin
hRes := pEnum.Next(1, vOut, dwRetrieved);
if hRes <> S_OK then
Break;
act_ListItem := EventListItems.Add;
s := Stringreplace(VarToStr(vOut.Message),#13,'',[rfReplaceAll, rfIgnoreCase]);
if (s = '') and (VarArrayDimCount(vOut.InsertionStrings)> 0) then begin
for x:=0 to VarArrayDimCount(vOut.InsertionStrings) do
s := s + Stringreplace(VarToStr(vOut.InsertionStrings[x]),#13,'',[rfReplaceAll, rfIgnoreCase]);
end;
s := Stringreplace(s,#10,'',[rfReplaceAll, rfIgnoreCase]);
act_ListItem.Caption := s;
act_ListItem.ImageIndex := vOut.EventType;
act_ListItem.SubItems.Add(Copy(vOut.TimeGenerated, 7,2) + '.' + Copy(vOut.TimeGenerated,5,2) + '.' + Copy(vOut.TimeGenerated,1,4));
act_ListItem.SubItems.Add(Copy(vOut.TimeGenerated, 9,2) + ':' + Copy(vOut.TimeGenerated,11,2) + ':' + Copy(vOut.TimeGenerated,13,2));
end;
end;
Ich habe folgende WMI Abfrage, die an sich sehr gut funktioniert. Aber wenn das Ereignislog zu gross ist, dann bekomm ich in der "aObjSet := aSrv.ExecQuery("-Zeile einen Fehler, dass der Arbeitsspeicher zu klein ist. Was kann ich tun ?
procedure CreateEventListForService (Host, User, Pwd : String; VAR EventListItems : TListItems; SourceName : String);
VAR
aLoc : ISWbemLocator;
aSrv : ISWbemServices;
aObjSet : ISWbemObjectSet;
pEnum : IEnumVARIANT;
vOut : OleVariant;
dwRetrieved : LongWord;
hRes : HResult;
s : String;
act_ListItem : TListItem;
x : integer;
begin
aLoc := CoSWbemLocator.Create;
aSrv := aLoc.ConnectServer(Host,'',User,Pwd,'','',0, nil);
aSrv.Security_.ImpersonationLevel := wbemImpersonationLevelImpersonate;
aObjSet := aSrv.ExecQuery('SELECT EventType, Message, TimeGenerated, InsertionStrings ' +
'FROM Win32_NTLogEvent WHERE Logfile="Application" AND SourceName="' + SourceName + '"',
'WQL', 0, nil);
pEnum := aObjSet.Get__NewEnum as IEnumVARIANT;
while (TRUE) do
begin
hRes := pEnum.Next(1, vOut, dwRetrieved);
if hRes <> S_OK then
Break;
act_ListItem := EventListItems.Add;
s := Stringreplace(VarToStr(vOut.Message),#13,'',[rfReplaceAll, rfIgnoreCase]);
if (s = '') and (VarArrayDimCount(vOut.InsertionStrings)> 0) then begin
for x:=0 to VarArrayDimCount(vOut.InsertionStrings) do
s := s + Stringreplace(VarToStr(vOut.InsertionStrings[x]),#13,'',[rfReplaceAll, rfIgnoreCase]);
end;
s := Stringreplace(s,#10,'',[rfReplaceAll, rfIgnoreCase]);
act_ListItem.Caption := s;
act_ListItem.ImageIndex := vOut.EventType;
act_ListItem.SubItems.Add(Copy(vOut.TimeGenerated, 7,2) + '.' + Copy(vOut.TimeGenerated,5,2) + '.' + Copy(vOut.TimeGenerated,1,4));
act_ListItem.SubItems.Add(Copy(vOut.TimeGenerated, 9,2) + ':' + Copy(vOut.TimeGenerated,11,2) + ':' + Copy(vOut.TimeGenerated,13,2));
end;
end;
Comment