Delphi-Quellcode:
While Enum.Next(1, WMIObject, W) = S_OK do Begin
PropEnum := ISWbemPropertySet((IUnknown(WMIObject) as ISWbemObject).Properties_)._NewEnum as IEnumVariant;
Prop := 0;
If Instance > 0 Then SetLength(_WMIResults.Instance[Instance].PropValue, Length(_WMIResults.PropName));
While PropEnum.Next(1, WMIObject, W) = S_OK do Begin
WMIProp := IUnknown(WMIObject) as ISWbemProperty;
If Instance = 0 Then Begin
SetLength(_WMIResults.PropName, Prop + 1);
SetLength(_WMIResults.Instance[Instance].PropValue, Prop + 1);
_WMIResults.PropName[Prop] := WMIProp.Name;
End;
_WMIResults.Instance[Instance].PropValue[Prop] := WMIProp;
Inc(Prop);
End;
Inc(Instance);
End;
Beim ersten Durchlauf wird die Anzahl der Properties ermittelt. Denn beim zweiten Durchlauf werden die beiden SetLength-Befehl nichtmehr ausgeführt. Es muss doch eine andere Möglichkeit geben an die Anzahl der Properties zu kommen.
Edit:
Ich habe die While-Schleife mal so abgeändert :
Delphi-Quellcode:
While Enum.Next(1, WMIObject, W) = S_OK do Begin
PropEnum := ISWbemPropertySet((IUnknown(WMIObject) as ISWbemObject).Properties_)._NewEnum as IEnumVariant;
Prop := 0;
SetLength(_WMIResults.PropName, ISWbemPropertySet((IUnknown(WMIObject) as ISWbemObject).Properties_).Count);
SetLength(_WMIResults.Instance[Instance].PropValue, ISWbemPropertySet((IUnknown(WMIObject) as ISWbemObject).Properties_).Count);
While PropEnum.Next(1, WMIObject, W) = S_OK do Begin
WMIProp := IUnknown(WMIObject) as ISWbemProperty;
_WMIResults.PropName[Prop] := WMIProp.Name;
_WMIResults.Instance[Instance].PropValue[Prop] := WMIProp;
Inc(Prop);
End;
Inc(Instance);
End;
Funktionieren tut es genauso, wie die anderen beiden While-Schleife. Ich hatte aber gedacht, dass wenn ich von Anfang an einen festen Wert zuweise das Speicherproblem gelöst wäre. Ist aber nicht so.
Edit 2:
Sourcecode aus Edit 1 korrigiert.