Содержание материала

 

5.2. Получение данных о запущенных процессах.

Данный пример будет отличаться от предыдущего только тем, что я использую нехитрый приём и покажу, как вывести все свойства объекта некого класса, не зная самих имён этих свойств. Действуем так же, как и в первом примере:

Code:

var

Form1: TForm1;

ListItem: TListItem;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var

Service: ISWbemServices;

ObjectSet: ISWbemObjectSet;

SObject: ISWbemObject;

PropSet: ISWbemPropertySet;

SProp: ISWbemProperty;

 

PropEnum, Enum: IEnumVariant;

TempObj: OleVariant;

Value: Cardinal;

Column: TListColumn;

begin

ListView1.Items.BeginUpdate;

ListView1.Items.Clear;

 

Service := SWbemLocator1.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0,

   nil);

SObject := Service.Get('Win32_Process', wbemFlagUseAmendedQualifiers, nil);

ObjectSet := SObject.Instances_(0, nil);

Enum := (ObjectSet._NewEnum) as IEnumVariant;

 

{

На данном этапе начинаются некоторые незначительные отличия от первого примера.

В предыдущем примере, мы знали, что у нас был единственный экземпляр класса

Win32_Processor, характеризующий центральный процессор.

В данном примере мы имеем столько экземпляров, сколько запущенных процессов,

поэтому их все необходимо перебрать и получить их свойства:

}

 

// в этом цикле перебираю все имеющиеся экземпляры

while (Enum.Next(1, TempObj, Value) = S_OK) do

begin

   SObject := IUnknown(TempObj) as SWBemObject;

   PropSet := SObject.Properties_;

   PropEnum := (PropSet._NewEnum) as IEnumVariant;

   ListItem := ListView1.Items.Add;

 

   // перебираю свойства

   while (PropEnum.Next(1, TempObj, Value) = S_OK) do

   begin

     SProp := IUnknown(TempObj) as SWBemProperty;

     if ListView1.Items.Count = 1 then

     begin

       Column := ListView1.Columns.Add;

       Column.Width := 100;

       Column.Caption := SProp.Name;

     end;

     ShowProp(SProp);

   end;

end; { while }

ListView1.Items.EndUpdate;

end;

// В процедуре ShowProp происходит определение типа свойства

// и соответствующие приведение типа.

 

procedure TForm1.ShowProp(SProp: ISWbemProperty);

var

StrValue: string;

Count: Cardinal;

begin

StrValue := '';

if VarIsNull(SProp.Get_Value) then

   StrValue := '<empty>'

else

   case SProp.CIMType of

     //******************************************************************//

     wbemCimtypeUint8, wbemCimtypeSint8, wbemCimtypeUint16, wbemCimtypeSint16,

       wbemCimtypeUint32, wbemCimtypeSint32, wbemCimtypeSint64:

       if VarIsArray(SProp.Get_Value) then

       begin

         if VarArrayHighBound(SProp.Get_Value, 1)>

         0 then

           for Count := 1 to VarArrayHighBound(SProp.Get_Value, 1) do

             StrValue := StrValue + ' ' + IntToStr(SProp.Get_Value[Count]);

       end

       else

         StrValue := IntToStr(SProp.Get_Value);

     //******************************************************************//

     wbemCimtypeReal32, wbemCimtypeReal64:

       StrValue := FloatToStr(SProp.Get_Value);

     //******************************************************************//

 

     …

 

     //******************************************************************//

   else

     MessageBox(0, PChar('Unknown type'), PChar(Form1.Caption), MB_OK);

   end; {case}

if ListItem.Caption = '' then

   ListItem.Caption := StrValue

else

   ListItem.SubItems.Add(StrValue);

end;

 

end.

 

 

 

Исходный код и exe-файл данного примера вы сможете найти в прилагаемом к статье архиве в каталогах \source\ GetProcessData и \Exe-files соответственно.
 
А выглядит это так:

clip0101

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить