Skip to content

Commit 9466a8e

Browse files
committed
[vmi] solved some memory leaks
1 parent 49c7832 commit 9466a8e

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

Quick.WMI.pas

+29-9
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ function TWMICollector.From(const aHost, aRoot, aWMIClass : string) : IWMIClass;
164164
colItems := fWMIService.ExecQuery(Format('SELECT * FROM %s',[aWMIClass]),'WQL',wbemFlagForwardOnly and wbemFlagReturnImmediately);
165165
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
166166
Result := TWMIClass.Create(fWMIService,aWMIClass,oEnum);
167+
oEnum := nil;
168+
colItems := Unassigned;
167169
except
168170
on E : Exception do raise EWMICollector.CreateFmt('Error getting WMI Class "\\%s\%s\%s": %s',[aHost,aRoot,aWMIClass,e.Message]);
169171
end;
@@ -191,21 +193,34 @@ function TWMIInstance.GetName: string;
191193
function TWMIInstance.GetProperties(const aProperties : TArray<string>) : IList<TFlexPair>;
192194
var
193195
prop : string;
196+
item : OleVariant;
194197
begin
195198
Result := TxList<TFlexPair>.Create;
196199
for prop in aProperties do
197200
begin
198201
try
199-
Result.Add(TFlexPair.Create(prop,fWMIItem.Properties_.Item(prop, 0)));
202+
item := fWMIItem.Properties_.Item(prop, 0);
203+
try
204+
Result.Add(TFlexPair.Create(prop,item));
205+
finally
206+
item := Unassigned;
207+
end;
200208
except
201209
on E : Exception do raise EWMICollector.CreateFmt('Retrieving "%s" (%s)',[prop,e.message]);
202210
end;
203211
end;
204212
end;
205213

206214
function TWMIInstance.GetProperty(const aPropertyName: string): TFlexValue;
215+
var
216+
item : OleVariant;
207217
begin
208-
Result := fWMIItem.Properties_.Item(aPropertyName, 0);
218+
item := fWMIItem.Properties_.Item(aPropertyName, 0);
219+
try
220+
Result := item;
221+
finally
222+
item := Unassigned;
223+
end;
209224
end;
210225

211226
{ TWMIClass }
@@ -219,7 +234,7 @@ constructor TWMIClass.Create(aWMIService : OleVariant; const aClassName : string
219234

220235
destructor TWMIClass.Destroy;
221236
begin
222-
//fWMIClassItems := nil;
237+
fWMIClassItems := nil;
223238
fWMIService := Unassigned;
224239
inherited;
225240
end;
@@ -232,8 +247,8 @@ function TWMIClass.GetInstance(const aInstance: string): IWMIInstance;
232247
begin
233248
while fWMIClassItems.Next(1, propItem, iValue) = 0 do
234249
begin
235-
instanceName := GetInstanceName(propItem);
236250
try
251+
instanceName := GetInstanceName(propItem);
237252
if CompareText(aInstance,instanceName) = 0 then
238253
begin
239254
Result := TWMIInstance.Create(instanceName,propItem);
@@ -256,6 +271,7 @@ function TWMIClass.GetInstanceName(aWMIClass : OleVariant) : string;
256271
iValue : Cardinal;
257272
properties : OleVariant;
258273
objSWbemObjectSet : OleVariant;
274+
item : OleVariant;
259275
begin
260276
Result := '';
261277
objSWbemObjectSet:= fWMIService.Get(fClassName, wbemFlagUseAmendedQualifiers and wbemFlagReturnWhenComplete);
@@ -273,17 +289,21 @@ function TWMIClass.GetInstanceName(aWMIClass : OleVariant) : string;
273289
//Result := rgvarQualif.Value;
274290
if qualifItem.Name = 'key' then
275291
begin
276-
if qualifItem.Value then if Result = '' then Result := aWMIClass.Properties_.Item(propItem.Name,0)
277-
else Result := Format('%s %s',[Result,aWMIClass.Properties_.Item(propItem.Name,0)]);
292+
item := aWMIClass.Properties_.Item(propItem.Name,0);
293+
try
294+
if qualifItem.Value then if Result = '' then Result := item
295+
else Result := Format('%s %s',[Result,item]);
296+
finally
297+
item := Unassigned;
298+
end;
278299
end;
279-
//VarClear(qualifItem);
280300
qualifItem := Unassigned;
281301
end;
282-
//enumQualif := nil;
302+
enumQualif := nil;
283303
qualifiers := Unassigned;
284304
propItem := Unassigned;
285305
end;
286-
//enumProp := nil;
306+
enumProp := nil;
287307
properties := Unassigned;
288308
objSWbemObjectSet := Unassigned;
289309
end;

0 commit comments

Comments
 (0)