Re[2]: WMI Delphi
От: lka_76  
Дата: 29.05.06 04:24
Оценка:
Здравствуйте, alive

продолжаю разбараться..
получается но не все..
подскажите а как разобраться с Win32_NetworkAdapterConfiguration делаю анологично примеру...
получаю 8 сеетвых адаптеров ! и все это в куче... т.е примерно 8*60=480 свойств.. а мне нужно всего 2*8, ито если активны...
реально всего 2 (иногда 4 это когда 2 сетевых карты) MACAddress и IPAddress...
причем MAC получается без проблем... а вот IP непонятно.. теоритически это массив при отладке пишет что array of Varian... но
VarArrayHighBound(SProp.Get_Value, 1) возвращает 0....
использую следующий код (взял из примера только заменил на Win32_NetworkAdapterConfiguration):
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
  Memo1.Lines.Clear;

  Service := SWbemLocator1.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
  SObject := Service.Get('Win32_NetworkAdapterConfiguration', wbemFlagUseAmendedQualifiers, nil);
  ObjectSet := SObject.Instances_(0, nil);
  Enum := (ObjectSet._NewEnum) as IEnumVariant;


  while (Enum.Next(1, TempObj, Value) = S_OK) do
  begin
    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;
        Memo1.Lines.Add('***'+SProp.Name);
      ShowProp(SProp);
    end;
  end; { while }
end;

procedure TForm1.ShowProp(SProp: ISWbemProperty);
var
  StrValue: string;
  Count: Cardinal;
begin
  StrValue := '';
  Memo1.Lines.Add('SProp.CIMType'+IntToStr(SProp.CIMType));
  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);
      //******************************************************************//
      wbemCimtypeString:
      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 + ' ' + SProp.Get_Value[Count];
        end
        else
          StrValue := SProp.Get_Value;
      //…

      //******************************************************************//
    else begin
      StrValue:='-неизвестный тип';
      end;
    end; {case}
    Memo1.Lines.Add(StrValue);
end;


при отладке попадаем 
   wbemCimtypeString:
      if VarIsArray(SProp.Get_Value) then
        begin
          if VarArrayHighBound(SProp.Get_Value, 1) <> 0 then  //здесь False и все...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.