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;