Thema: Delphi Memory-Leak WMI

Einzelnen Beitrag anzeigen

El.Blindo

Registriert seit: 24. Okt 2006
18 Beiträge
 
#13

Re: Memory-Leak WMI

  Alt 30. Jan 2007, 22:49
Die ist zumindestens bei Delphi 7 dabei. Ausserdem hab ich gesehen das man hier irgendwo im Forum die WbemScripting.pas downloaden kann, such mal nach WMI.

Aber zurück zum Thema:

Ich hab mal ein wenig geguckt und eine Componente für WMI gefunden bei Magnenta Systems. Dieser Componente liegt eine Beispiel Application bei. (Wobei, eigentlich will ich keine fertige Componente verwenden, ich will das selbst kapieren)

Also gestartet das Ding, und siehe da, bei wiederholtem Abfragen einzelner Werte = MEMORY-Leak. Also entweder machen die zufällig excakt die selben Fehler wie ich, oder der fehler liegt im WMI.

Scheint also tatsächlich am WMI selbst zu liegen, Schade, ist ein mächtiges Werkzeug, aber seit wann macht M$ schon mal was richtig.

Kleines Edit:

Hab mir mal so einige Sachen hier im Forum angeschaut, z.B. Himitsu's WMI+Demo usw., musste dabei feststellen das dieses Memory Leak wohl in jeder Application vorhanden ist.

Vielleicht liegt es daran das ich SP2 nicht drauf hab, aber ehrlich gesagt hab ich kein Bock nur deswegen SP2 zu installieren, eigentlich hab ich gar keinen Bock SP2 zu installieren.

Mal sehen, Morgen Abend krieg ich meinen Lappy wieder, da is Media Center SP2 drauf, schaun wie es da ist.

Und weiter versucht, andere variante zum Auslesen von WMI, abgeguckt hier im Forum. Das memory Leak bleibt

Delphi-Quellcode:
procedure TForm1.getWMIProcess(Liste:TStrings);
var
   l_WMILocator: ISWbemLocator;
   l_WMIServices: ISWbemServices;
   l_WMIObjectDefinition: ISWbemObject;
   l_WMIObjectSet: SWbemObjectSet;
   l_WMIObjectInstances: IEnumVariant;
   l_WMIObject: ISWbemObject;
   l_WMIPropertySet: ISWbemPropertySet;
   l_WMIProperty: ISWbemProperty;

   l_TempObj: OleVariant;
   PropVal : OLEVariant;
   l_ObjValue: Cardinal;

   WMI_Name : String;
   WMI_PID : uint64;
   WMI_Tick : uint64;
   WMI_UTime : uint64;
   WMI_KTime : uint64;
   WMI_Mem : uint64;

   function GetValue(Value : String) : Variant;
   begin
     try
       PropVal := (l_WMIObject.Properties_.Item(Value, 0) as ISWbemProperty).Get_Value;
       if not (VarIsEmpty(PropVal) or VarIsNull(PropVal)) then Result := PropVal;
     except
     end;
   end;

begin
   Memo1.Lines.BeginUpdate;
   Memo1.Clear;
   l_WMILocator := CoSWbemLocator.Create;
   try
     If l_WMILocator <> nil then
     Begin
       l_WMIServices := L_WMILocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
       If l_WMIServices <> nil then
       Begin
         l_WMIObjectSet := l_WMIServices.ExecQuery('SELECT * FROM Win32_Process', 'WQL',
                                                wbemFlagReturnWhenComplete, nil);
         If l_WMIObjectSet <> nil then
         with l_WMIObjectSet do
         Begin
           l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant;
           If l_WMIObjectInstances <> nil then
           begin
             If l_WMIObjectSet.Count > 0 then
             Begin
               while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do
               begin
                 l_WMIObject:= IUnknown(l_TempObj) as ISWBemObject;
                 PropVal := (l_WMIObject.Properties_.Item('Name', 0) as ISWbemProperty).Get_Value;
                 if not (VarIsEmpty(PropVal) or VarIsNull(PropVal)) then
                 Begin
                   WMI_Name := GetValue('Name');
                   WMI_PID := GetValue('ProcessId');
                   WMI_Mem := GetValue('WorkingSetSize') div 1024;
                   WMI_UTime := GetValue('UserModeTime');
                   WMI_KTime := GetValue('KernelModeTime');
                 end;
                 Liste.Add(IntToStr(WMI_PID) + ' : ' + WMI_Name + ' - ' +
                           IntToStr(WMI_Mem) + ' K ' +
                           InttoStr(WMI_UTime + WMI_KTime));
               end;
             end;
           end;
         end;
       end;
     end;
   finally
     l_WMILocator := nil;
     l_WMIServices := nil;
   end;
   Memo1.Lines.EndUpdate;
end;
  Mit Zitat antworten Zitat