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

Вот что у меня получилось:

clip0044

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:= ''

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 соответственно.
 

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

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

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

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


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