Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Вызов методов WMI с 2-мя и более параметрами


Автор: -Сергей- 6.4.2017, 09:40
Всем привет!
В общем при вызове методов без параметров и с одним параметром проблем не возникает, а при вызове методов с параметрами больше одного возникает ошибка "Недопустимые параметры метода"
Вот реализация на примере изменения яркости экрана (на стационарных компах не будет работать, только на ноутбуках, нетбуках и пр.)
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  SWbemLocator        : ISWbemLocator;
  Service             : ISWbemServices;
  ObjectSet           : ISWbemObjectSet;
  InParam, SObject    : ISWbemObject;
  PropValue           : OleVariant;
  PropSet             : ISWbemPropertySet;
  SProp               : ISWbemProperty;

  PropEnum, Enum      : IEnumVariant;
  Value               : Cardinal;
begin
  SWbemLocator := CoSWbemLocator.Create;
  Service:= SWbemLocator.ConnectServer('.', 'root\wmi', '', '', '', '', 0, nil);
  // получаем текущую яркость экрана
  SObject:= Service.Get('WmiMonitorBrightness', wbemFlagUseAmendedQualifiers, nil);
  ObjectSet:= SObject.Instances_(0, nil);
  Enum:= (ObjectSet._NewEnum) as IEnumVariant;

  while (Enum.Next(1, PropValue, Value) = S_OK) do
  begin
    SObject:= IUnknown(PropValue) as SWBemObject;
    PropSet:= SObject.Properties_;
    PropEnum:= (PropSet._NewEnum) as IEnumVariant;
    while (PropEnum.Next(1, PropValue, Value) = S_OK) do
    begin
      SProp:= IUnknown(PropValue) as SWBemProperty;
      if SProp.Name = 'CurrentBrightness' then
        Label1.Caption := Format('CurrentBrightness = %d%%',[Integer(SProp.Get_Value)]);
    end;
  end;

  // устанавливаем яркость экрана
  SObject:= Service.Get('WmiMonitorBrightnessMethods', wbemFlagUseAmendedQualifiers, nil);

  InParam := SObject.Methods_.Item('WmiSetBrightness', 0).InParameters.SpawnInstance_(0);
  PropValue:= 100;
  InParam.Properties_.Add('Brightness', wbemCimtypeUint8, False, 0).Set_Value(PropValue);
  PropValue:= 50;
  InParam.Properties_.Add('Timeout', wbemCimtypeUint32, False, 0).Set_Value(PropValue);

  {
  // Проверка параметров
  PropEnum := (InParam.Properties_._NewEnum) as IEnumVariant;
  while (PropEnum.Next(1, TempObj, Value) = S_OK) do
  begin
    SProp:= IUnknown(TempObj) as SWBemProperty;
    ShowMessage(SProp.Name+'='+String(SProp.Get_Value));
  end;
  }
  // при вызове метода возникает ошибка
  SObject.ExecMethod_('WmiSetBrightness', InParam, 0, nil);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)