![]() |
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.
|
Re: Memory-Leak WMI
Ich habe leider kein WbemScripting.
|
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; |
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. |
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. |
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