@@ -164,6 +164,8 @@ function TWMICollector.From(const aHost, aRoot, aWMIClass : string) : IWMIClass;
164
164
colItems := fWMIService.ExecQuery(Format(' SELECT * FROM %s' ,[aWMIClass]),' WQL' ,wbemFlagForwardOnly and wbemFlagReturnImmediately);
165
165
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
166
166
Result := TWMIClass.Create(fWMIService,aWMIClass,oEnum);
167
+ oEnum := nil ;
168
+ colItems := Unassigned;
167
169
except
168
170
on E : Exception do raise EWMICollector.CreateFmt(' Error getting WMI Class "\\%s\%s\%s": %s' ,[aHost,aRoot,aWMIClass,e.Message]);
169
171
end ;
@@ -191,21 +193,34 @@ function TWMIInstance.GetName: string;
191
193
function TWMIInstance.GetProperties (const aProperties : TArray<string>) : IList<TFlexPair>;
192
194
var
193
195
prop : string;
196
+ item : OleVariant;
194
197
begin
195
198
Result := TxList<TFlexPair>.Create;
196
199
for prop in aProperties do
197
200
begin
198
201
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 ;
200
208
except
201
209
on E : Exception do raise EWMICollector.CreateFmt(' Retrieving "%s" (%s)' ,[prop,e.message]);
202
210
end ;
203
211
end ;
204
212
end ;
205
213
206
214
function TWMIInstance.GetProperty (const aPropertyName: string): TFlexValue;
215
+ var
216
+ item : OleVariant;
207
217
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 ;
209
224
end ;
210
225
211
226
{ TWMIClass }
@@ -219,7 +234,7 @@ constructor TWMIClass.Create(aWMIService : OleVariant; const aClassName : string
219
234
220
235
destructor TWMIClass.Destroy;
221
236
begin
222
- // fWMIClassItems := nil;
237
+ fWMIClassItems := nil ;
223
238
fWMIService := Unassigned;
224
239
inherited ;
225
240
end ;
@@ -232,8 +247,8 @@ function TWMIClass.GetInstance(const aInstance: string): IWMIInstance;
232
247
begin
233
248
while fWMIClassItems.Next(1 , propItem, iValue) = 0 do
234
249
begin
235
- instanceName := GetInstanceName(propItem);
236
250
try
251
+ instanceName := GetInstanceName(propItem);
237
252
if CompareText(aInstance,instanceName) = 0 then
238
253
begin
239
254
Result := TWMIInstance.Create(instanceName,propItem);
@@ -256,6 +271,7 @@ function TWMIClass.GetInstanceName(aWMIClass : OleVariant) : string;
256
271
iValue : Cardinal;
257
272
properties : OleVariant;
258
273
objSWbemObjectSet : OleVariant;
274
+ item : OleVariant;
259
275
begin
260
276
Result := ' ' ;
261
277
objSWbemObjectSet:= fWMIService.Get(fClassName, wbemFlagUseAmendedQualifiers and wbemFlagReturnWhenComplete);
@@ -273,17 +289,21 @@ function TWMIClass.GetInstanceName(aWMIClass : OleVariant) : string;
273
289
// Result := rgvarQualif.Value;
274
290
if qualifItem.Name = ' key' then
275
291
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 ;
278
299
end ;
279
- // VarClear(qualifItem);
280
300
qualifItem := Unassigned;
281
301
end ;
282
- // enumQualif := nil;
302
+ enumQualif := nil ;
283
303
qualifiers := Unassigned;
284
304
propItem := Unassigned;
285
305
end ;
286
- // enumProp := nil;
306
+ enumProp := nil ;
287
307
properties := Unassigned;
288
308
objSWbemObjectSet := Unassigned;
289
309
end ;
0 commit comments