Entwickler-Ecke

Windows API - SWbemServices freigeben


Bergmann89 - Sa 08.12.12 15:47
Titel: SWbemServices freigeben
Hey Leute,

ich hab heute festgestellt, das meine Anwendung viele Threads ohne Aufgabe hat. Also bin ich dem mal auf den Grund gegangen und hab festgestellt, das ein SWbemService erstellt wird. Dieser erstellt 5 neue Threads, die aber nicht wieder freigegeben werden. Wie genau mach ich das? Ich will nicht, das die Thread die ganze Zeit sinnlos im Hintergrund rumliegen. Hier mal die Prozedur, in der ich den SWbemService nutze.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
procedure GetWin32_ProcessorInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : Variant;
  oEnum         : IEnumvariant;
  i: Integer;
begin;
  try try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Processor','WQL',wbemFlagForwardOnly);
    oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    i := 0;
    while oEnum.Next(1, FWbemObject, nil) = 0 do begin
      inc(i);
      LogMsg('  Processor '+IntToStr(i)+' Information:');

      WriteVariant('    AddressWidth: '#9#9#9,          FWbemObject.Properties_.Item('AddressWidth').Value);
      WriteVariant('    Caption: '#9#9#9#9,             FWbemObject.Properties_.Item('Caption').Value);
      WriteVariant('    CurrentClockSpeed: '#9#9,       FWbemObject.Properties_.Item('CurrentClockSpeed').Value);
      WriteVariant('    Description: '#9#9#9,           FWbemObject.Properties_.Item('Description').Value);
      WriteVariant('    ExtClock: '#9#9#9,              FWbemObject.Properties_.Item('ExtClock').Value);
      WriteVariant('    Family: '#9#9#9#9,              FWbemObject.Properties_.Item('Family').Value);
      WriteVariant('    Manufacturer: '#9#9#9,          FWbemObject.Properties_.Item('Manufacturer').Value);
      WriteVariant('    MaxClockSpeed: '#9#9#9,         FWbemObject.Properties_.Item('MaxClockSpeed').Value);
      WriteVariant('    Name: '#9#9#9#9,                FWbemObject.Properties_.Item('Name').Value);
      WriteVariant('    NumberOfCores: '#9#9#9,         FWbemObject.Properties_.Item('NumberOfCores').Value);
      WriteVariant('    NumberOfLogicalProcessors: '#9, FWbemObject.Properties_.Item('NumberOfLogicalProcessors').Value);
      WriteVariant('    Version: '#9#9#9#9,             FWbemObject.Properties_.Item('Version').Value);
      FWbemObject := Unassigned;
    end;
  finally
    oEnum          := Unassigned;
    FWbemObjectSet := Unassigned;
    FWMIService    := Unassigned;
    FSWbemLocator  := Unassigned;
  end;
  except
    on E:EOleException do
      LogMsg(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
     on E:Exception do
      LogMsg(E.Classname + ': ' + E.Message);
  end;
end;


€: hab grad versucht das ganze in einen Thread auszulagern und dort zu laden, aber das hat auch nix gebracht. Die Threads die beim Laden erstellt werden sind nachwievor vorhanden :(

MfG & Thx Bergmann.