Browse Source

[vmi] solved some memory leaks

Exilon 5 years ago
parent
commit
9466a8e6a1
1 changed files with 29 additions and 9 deletions
  1. 29 9
      Quick.WMI.pas

+ 29 - 9
Quick.WMI.pas

@@ -164,6 +164,8 @@ begin
     colItems := fWMIService.ExecQuery(Format('SELECT * FROM %s',[aWMIClass]),'WQL',wbemFlagForwardOnly and wbemFlagReturnImmediately);
     colItems := fWMIService.ExecQuery(Format('SELECT * FROM %s',[aWMIClass]),'WQL',wbemFlagForwardOnly and wbemFlagReturnImmediately);
     oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
     oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
     Result := TWMIClass.Create(fWMIService,aWMIClass,oEnum);
     Result := TWMIClass.Create(fWMIService,aWMIClass,oEnum);
+    oEnum := nil;
+    colItems := Unassigned;
   except
   except
     on E : Exception do raise EWMICollector.CreateFmt('Error getting WMI Class "\\%s\%s\%s": %s',[aHost,aRoot,aWMIClass,e.Message]);
     on E : Exception do raise EWMICollector.CreateFmt('Error getting WMI Class "\\%s\%s\%s": %s',[aHost,aRoot,aWMIClass,e.Message]);
   end;
   end;
@@ -191,12 +193,18 @@ end;
 function TWMIInstance.GetProperties(const aProperties : TArray<string>) : IList<TFlexPair>;
 function TWMIInstance.GetProperties(const aProperties : TArray<string>) : IList<TFlexPair>;
 var
 var
   prop : string;
   prop : string;
+  item : OleVariant;
 begin
 begin
   Result := TxList<TFlexPair>.Create;
   Result := TxList<TFlexPair>.Create;
   for prop in aProperties do
   for prop in aProperties do
   begin
   begin
     try
     try
-      Result.Add(TFlexPair.Create(prop,fWMIItem.Properties_.Item(prop, 0)));
+      item := fWMIItem.Properties_.Item(prop, 0);
+      try
+        Result.Add(TFlexPair.Create(prop,item));
+      finally
+        item := Unassigned;
+      end;
     except
     except
       on E : Exception do raise EWMICollector.CreateFmt('Retrieving "%s" (%s)',[prop,e.message]);
       on E : Exception do raise EWMICollector.CreateFmt('Retrieving "%s" (%s)',[prop,e.message]);
     end;
     end;
@@ -204,8 +212,15 @@ begin
 end;
 end;
 
 
 function TWMIInstance.GetProperty(const aPropertyName: string): TFlexValue;
 function TWMIInstance.GetProperty(const aPropertyName: string): TFlexValue;
+var
+  item : OleVariant;
 begin
 begin
-  Result := fWMIItem.Properties_.Item(aPropertyName, 0);
+  item := fWMIItem.Properties_.Item(aPropertyName, 0);
+  try
+    Result := item;
+  finally
+    item := Unassigned;
+  end;
 end;
 end;
 
 
 { TWMIClass }
 { TWMIClass }
@@ -219,7 +234,7 @@ end;
 
 
 destructor TWMIClass.Destroy;
 destructor TWMIClass.Destroy;
 begin
 begin
-  //fWMIClassItems := nil;
+  fWMIClassItems := nil;
   fWMIService := Unassigned;
   fWMIService := Unassigned;
   inherited;
   inherited;
 end;
 end;
@@ -232,8 +247,8 @@ var
 begin
 begin
   while fWMIClassItems.Next(1, propItem, iValue) = 0 do
   while fWMIClassItems.Next(1, propItem, iValue) = 0 do
   begin
   begin
-    instanceName := GetInstanceName(propItem);
     try
     try
+      instanceName := GetInstanceName(propItem);
       if CompareText(aInstance,instanceName) = 0 then
       if CompareText(aInstance,instanceName) = 0 then
       begin
       begin
         Result := TWMIInstance.Create(instanceName,propItem);
         Result := TWMIInstance.Create(instanceName,propItem);
@@ -256,6 +271,7 @@ var
   iValue : Cardinal;
   iValue : Cardinal;
   properties : OleVariant;
   properties : OleVariant;
   objSWbemObjectSet : OleVariant;
   objSWbemObjectSet : OleVariant;
+  item : OleVariant;
 begin
 begin
   Result := '';
   Result := '';
   objSWbemObjectSet:= fWMIService.Get(fClassName, wbemFlagUseAmendedQualifiers and wbemFlagReturnWhenComplete);
   objSWbemObjectSet:= fWMIService.Get(fClassName, wbemFlagUseAmendedQualifiers and wbemFlagReturnWhenComplete);
@@ -273,17 +289,21 @@ begin
       //Result := rgvarQualif.Value;
       //Result := rgvarQualif.Value;
       if qualifItem.Name = 'key' then
       if qualifItem.Name = 'key' then
       begin
       begin
-        if qualifItem.Value then if Result = '' then Result := aWMIClass.Properties_.Item(propItem.Name,0)
-          else Result := Format('%s %s',[Result,aWMIClass.Properties_.Item(propItem.Name,0)]);
+        item := aWMIClass.Properties_.Item(propItem.Name,0);
+        try
+          if qualifItem.Value then if Result = '' then Result := item
+            else Result := Format('%s %s',[Result,item]);
+        finally
+          item := Unassigned;
+        end;
       end;
       end;
-      //VarClear(qualifItem);
       qualifItem := Unassigned;
       qualifItem := Unassigned;
     end;
     end;
-    //enumQualif := nil;
+    enumQualif := nil;
     qualifiers := Unassigned;
     qualifiers := Unassigned;
     propItem := Unassigned;
     propItem := Unassigned;
   end;
   end;
-  //enumProp := nil;
+  enumProp := nil;
   properties := Unassigned;
   properties := Unassigned;
   objSWbemObjectSet := Unassigned;
   objSWbemObjectSet := Unassigned;
 end;
 end;