Delphi - Információk a futó folyamatokról WMI segítségével

forráskód letöltése
A WMI (Windows Management Instrumentation) kiterjedt osztálystruktúrája révén a legbonyolultabb rendszerszintű műveletek, és lekérdezések is elvégezhetők. Cikkünkben is ez utóbbi műveletet hajtjuk végre. A WMI egyik speciális osztályának köszönhetően lehetőségünk van kigyűjteni az éppen futó folyamatok információit. Ehhez nem kell mást tennünk, csak minden folyamat esetében tulajdonságokat lekérdeznünk. Cikkünkben bemutatjuk ennek módját.
A legelső lépés, hogy egy TSWbemLocator komponenst teszünk a Form-ra. A WMI rendszer eléréséhez meg kell hívnunk a komponens ConnectServer metódusát.
Service:= SWbemLocator1.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
A Get metódussal elvégezzük a lekérdezést, melynek eredményeképpen egy objektum kollekciót kaphatunk meg, mely tartalmazza az összes futó folyamat objektumát.
SObject:= Service.Get('Win32_Process', wbemFlagUseAmendedQualifiers, nil);
Annak érdekében, hogy az objektum-kollekción egy ciklussal végigmenjünk, egy különleges típusba kell lekérdeznünk a kollekció elemeit.
ObjectSet:= SObject.Instances_(0, nil);
Enum:= (ObjectSet._NewEnum) as IEnumVariant;
Majd elindítjuk a ciklust, melyben minden objektumhoz létrehozunk egy újabb gyűjteményt, ami a property-k értékeit tartalmazza.
while (Enum.Next(1, tObj, Value) = S_OK) do begin
  SObject:= IUnknown(tObj) as SWBemObject;
  pSet:= SObject.Properties_;
  pEnum:= (pSet._NewEnum) as IEnumVariant;
  ListItem:= ListView1.Items.Add;
Majd ezen az újabb gyűjteményen is végigmegyünk, hogy a Form felületén található TListView komponensben elhelyezhessük az egyes process-ek jellemzőit.
while (pEnum.Next(1, tObj, Value) = S_OK) do begin
  SProp:= IUnknown(tObj) as SWBemProperty;
  if ListView1.Items.Count = 1 then begin
    Column:= ListView1.Columns.Add;
    Column.Width:= 100;
    Column.Caption:= SProp.Name;
  end;
  ShowProp(SProp);
  ...
A listaelemek felfűzését a ShowProp metódusbanm végezzük el, itt vizsgáljuk meg az egyes property-k típusait, és alakítjuk azok értékeit megjeleníthető formátumba.
Az egyes folyamatokról olyan adatok szerezhető, mint a létrehozás időpontja, az elérési útvonal, a process azonosítója, stb.