Einzelnen Beitrag anzeigen

Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#15

Re: Speicher läuft voll bei WMI....

  Alt 23. Sep 2007, 11:42
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat