Announcement

Collapse
No announcement yet.

Speicherproblem bei WMI Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speicherproblem bei WMI Abfrage

    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;

  • #2
    Nach einigem Suchen habe ich dann doch ein Flag gefunden, dass die Sache theoretisch bereinigt:

    ************************************************** *****
    http://www.microsoft.com/germany/msdn/library/windows/windows2000/LeitfadenWMISkripting1.mspx

    Anmerkung Das wbemFlagReturnImmediately-Flag (das in einer der Enumerationen definiert ist, die weiter oben kurz angesprochen wurden) entspricht dem Standardverhalten von ExecQuery und ist semisynchron. Die wichtige Optimierung wird durch das Hinzufügen des wbemFlagForwardOnly-Flags erreicht. Das Kombinieren von wbemFlagReturnImmediately mit wbemFlagForwardOnly ergibt einen vorwärtsgerichteten Enumerator. Ein vorwärtsgerichteter Enumerator funktioniert wesentlich schneller als der Standardenumerator, da WMI keine Verweise auf Objekte im SWbemObjectSet verwaltet.
    ************************************************** *****

    Leider versagt das ganze beim Aufruf auf einem Windows 2000 Server mit aktuellster WMI Installation. Hier bekomme ich eine Zugriffsverletzung im Modul "wbemdisp.dll".

    Hat jemand eine Idee was ich machen kann? Muss die Anwendung anders komiliert werden o.ä.

    Comment

    Working...
    X