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

А выглядит это так:

clip0045

5.3. Запуск приложений и выключение компьютера.

В данном примере я продемонстрирую, как использовать методы, предоставляемые провайдерами.

Code:

 

var

Form1: TForm1;

Service: ISWbemServices;

InParam, OutParam, SObject, Process:    ISWbemObject;

Method:   ISWbemMethod;

SProp1, SProp2, MyProperty: ISWbemProperty;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var

PropValue: OleVariant;

begin

Service:= SWbemLocator1.ConnectServer('.', 'root\cimv2', '', '', '',   '', 0, nil);

// см. Примечание 1

Service.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);

Process:= Service.Get('Win32_Process', 0, nil);

// см. Примечание 2 

Method:= Process.Methods_.Item('Create', 0);

// см. Примечание 3   

InParam:= Method.InParameters.SpawnInstance_(0);

// см. Примечание 4     

MyProperty:= InParam.Properties_.Add('CommandLine', wbemCimtypeString, False, 0); 

{

С помощью метода Set_Value объекта ISWbemProperty присваеваем свойству CommandLine

значение Notepad.exe

}

PropValue:= 'Notepad.exe';

MyProperty.Set_Value(PropValue);

 

// После того, как все входные свойства определены, запускаем приложение.

// OutParam - объект, возвращаемый методом ExecMethod_

 

OutParam:= Process.ExecMethod_('Create', InParam, 0, nil);

 

//  Получения выходных параметров из возвращённого объекта OutParam типа SWbemObject

 

SProp1:= outParam.Properties_.Item('ReturnValue', 0);

 

// Проверяю, удалось ли запустить приложение. Если свойство ReturnValue не равно 0,

// то произошла ошибка.

if SProp1.Get_Value = 0 then

begin

   SProp2:= outParam.Properties_.Item('ProcessID', 0);

   Button2.Enabled:= True;

   Button1.Enabled:= False;

   sleep(300);

   SetForegroundWindow(Form1.Handle);

end

else

   MessageBox(0, PChar('Не удалось запустить приложение.'), PChar(Form1.Caption), MB_OK);

 

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

PropValue: OleVariant;

begin

   SObject:= Service.Get('Win32_Process.Handle="' +  WideString(SProp2.Get_Value) + '"', 0, nil);

   Method:= SOBject.Methods_.Item('Terminate', 0);

   InParam:= Method.InParameters.SpawnInstance_(0);

   MyProperty:= InParam.Properties_.Add('Reason', wbemCimtypeUint32, False, 0);

   PropValue:= 0;

   MyProperty.Set_Value(PropValue);

   OutParam:= SObject.ExecMethod_('Terminate', InParam, 0, nil);

   SProp1:= outParam.Properties_.Item('ReturnValue', 0);

   if SProp1.Get_Value = 0 then

   begin

     Button1.Enabled:= True;

     Button2.Enabled:= False;

   end

   else

     MessageBox(0, PChar('Не удалось закрыть приложение.'), PChar(Form1.Caption), MB_OK);

end;

procedure TForm1.Button3Click(Sender: TObject);

var

ObjectSet: ISWbemObjectSet;

Enum:      IEnumVariant;

TempObj:   OleVariant;

Value:     Cardinal;

begin

// Выключение компьютера - использование Shutdown без свойств.

if MessageBox(0, PChar('Если вы выберете ''Да'', ваш компьютер выключится!'),

   PChar(Form1.Caption), MB_YESNO or MB_ICONEXCLAMATION or MB_DEFBUTTON2) = mrYes then

begin

   Service:= SWbemLocator1.ConnectServer('.', 'root\cimv2', '', '', '',

     '', 0, nil);

   Service.Security_.Privileges.Add(wbemPrivilegeShutdown, True);

// см. Примечание 5   

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

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

 

   ObjectSet:= Service.ExecQuery('SELECT * FROM Win32_OperatingSystem WHERE Primary=True',

     'WQL', wbemFlagReturnImmediately, nil);

 

   Enum:= (ObjectSet._NewEnum) as IEnumVariant;

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

   begin

     SObject:= IUnknown(tempObj) as SWBemObject;

     SObject.ExecMethod_('Shutdown', nil, 0, nil);

   end;

end; { if MessageBox }

end;

 

end.

Пояснения к коду:

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

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

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

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


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