Re: WMI Delphi
От: alive Россия  
Дата: 24.05.06 09:59
Оценка:
Здравствуйте, lka_76, Вы писали:

_>Добрый день!

_>пытаюсь научиться работать с WMI на Delphi.
_>столкнулся с проблемами:

А что конкретно вам не понятно? Как импортировать библиотеку типов?
В Delphi Project -> Import Type Library... В открывшемся окне в списке выбираем Microsoft WMI Scripting V1.2 Library(Version 1.2)
(Версия у вас может отличаться). Давим кнопку Create Unit. У меня после этого образовался юнит WbemScripting_TLB.pas.

Запрос 'select * from Win32_BaseBoard' возвращает коллекцию объектов Win32_BaseBoard. Поэтому к элементам нужно обращатся через энумератор. Вот пример который перечисляет и выводит в листбокс все свойства первой Win32_BaseBoard.

procedure TMainForm.Run;
var
  Service: ISWbemServices;
  ObjectSet: ISWbemObjectSet;
  SObject: ISWbemObject;
  PropSet: ISWbemPropertySet;
  SProp: ISWbemProperty;
  PropEnum, Enum: IEnumVariant;
  TempObj, PropVal: OleVariant;
  Value: Cardinal;

  LI: TListItem;
  vt: TVarType;
begin
  LVProp.Items.Clear;

  SWbemLocator:= TSWbemLocator.Create(Nil);
  try
    SWbemLocator:= TSWbemLocator.Create(Self);
    Service:= SWbemLocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
    SObject:= Service.Get('Win32_BaseBoard', wbemFlagUseAmendedQualifiers, nil);
    ObjectSet:= SObject.Instances_(0, nil);

    Enum:= (ObjectSet._NewEnum) as IEnumVariant;
    Enum.Next(1, TempObj, Value);

    SObject:= IUnknown(TempObj) as SWBemObject;
    PropSet := SObject.Properties_;
    PropEnum := (PropSet._NewEnum) as IEnumVariant;

    while (PropEnum.Next(1, TempObj, Value) = S_OK) do
    begin
      SProp:= IUnknown(TempObj) as SWBemProperty;
      LI:= LVProp.Items.Add;
      LI.Caption:= SProp.Name;
      PropVal:= SProp.Get_Value;
        if PropVal <> Null then
          LI.SubItems.Add(PropVal)
        else
          LI.SubItems.Add('-');
    end;
  finally
    SWbemLocator.Free;
  end;
end;
...<< RSDN@Home 1.2.0 alpha rev. 649>>
...Foobar {silent}
Keep yourself alive
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.