Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Memory-Leak WMI (https://www.delphipraxis.net/85400-memory-leak-wmi.html)

El.Blindo 30. Jan 2007 22:09

Re: Memory-Leak WMI
 
Wieso kann man den nicht testen ? Muss nur die WbemScripting_TLB über Import Type Library in das Project importieren, ist alles bei Delphi bei.

omata 30. Jan 2007 22:14

Re: Memory-Leak WMI
 
Ich habe leider kein WbemScripting.

El.Blindo 30. Jan 2007 22:49

Re: Memory-Leak WMI
 
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;

El.Blindo 1. Feb 2007 17:58

Re: Memory-Leak WMI
 
So, vorerst das letzte Update, bin am Ende mit meinem Latein.

Hab das Ganze mal unter Windows XP Media Center Edition SP2 getestet.

Resultat : Auch das selbe Memory-Leak. Also wenn hier keiner ne Idee hat
harke ich das Thema WMI einfach ab. Hab ja kein Problem damit eigene Fehler
zu suchen, aber auf Microsoft's Fehler hab ich leider keinen Einfluss.

MfG El-Blindo.

Christian Seehase 7. Feb 2007 12:21

Re: Memory-Leak WMI
 
Moin El-Blindo,

mir fällt nur auf, dass Du zwar das Memo löscht, aber dann zu Liste Zeilen hinzufügst.
Das solltest Du vielleicht mal in Einklang bringen ;-)

Ausserdem könntest Du mal zu Beginn der Routine den Timer ab, und am Ende wieder einschalten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz