Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2016, 21:46   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию НЕ все понятно с функцией WMI

Добрый день. для доступа к данным сервера WMI есть стандартный код, в частности функция

Код:
function MagWmiGetPropStr(WmiProp: ISWbemProperty):string ;
var
  I:integer ;
begin
  Result := '';
  if VarIsNull(WmiProp.Get_Value) then Result := 'NULL'
  else
  begin
    case WmiProp.CIMType of
    WbemCimtypeSint8,
    WbemCimtypeUint8,
    WbemCimtypeSint16,
    WbemCimtypeUint16,
    WbemCimtypeSint32,
    WbemCimtypeUint32,
    WbemCimtypeSint64:

    if VarIsArray(WmiProp.Get_Value) then
    begin

      for I := 0 to VarArrayHighBound(wmiProp.Get_Value, 1) do
      begin
        if I > 0 then Result := Result + '|' ;
        Result := Result + IntToStr(WmiProp.Get_Value [I]);
      end;

    end
    else Result := IntToStr (wmiProp.Get_Value);

    WbemCimtypeReal32,WbemCimtypeReal64:
    Result := FloatToStr(wmiProp.Get_Value);

    wbemCimtypeBoolean:
    //if Boolean(WmiProp.Get_Value) then Result := 'True' else Result := 'False';
    if (WmiProp.Get_Value) then Result := 'True' else Result := 'False';   (*начально*)

    WbemCimtypeString, WbemCimtypeUint64:
    if VarIsArray(WmiProp.Get_Value) then
    begin

      for I := 0 to VarArrayHighBound (WmiProp.Get_Value, 1) do
      begin
        if I > 0 then Result := Result + '|' ;
        Result := Result + WmiProp.Get_Value [I] ;
      end ;

    end else Result := WmiProp.Get_Value;

    WbemCimtypeDatetime:
    Result := WmiProp.Get_Value;

    WbemCimtypeReference:
    begin
      Result := wmiProp.Get_Value ;
      //Services.Get(result, 0, nil).GetObjectText_(0));  another query
    end;

    WbemCimtypeChar16:
    Result := '<16-bit character>';

    WbemCimtypeObject:
    Result := '<CIM Object>';
    end ;
  end;
end ;
RAD (WinXP, XE3) недовольна вот этим : if (WmiProp.Get_Value) then Result := 'True' else Result := 'False';
пишет что "выражение должно быть логическим" что соответсвует, так как в WbemScripting_TLB метод Get_Value

Код:
ISWbemProperty = interface(IDispatch)
    ['{1A388F98-D4BA-11D1-8B09-00600806D9B6}']
    function Get_Value: OleVariant; safecall;
end;
имеет тип OleVariant

Вопрос : что вообще тут можно сделать? непонятно как такой косяк вообще имеет место быть.
Pcrepair вне форума Ответить с цитированием
Старый 03.03.2016, 22:13   #2
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Вы уверенны, что тип точно Boolean?
Если да, то попробуйте прямо привести, т.е. объявите переменную типа Boolean и присвойте ей значение WmiProp.Get_Value, а ее уже проверяйте.
koljsch вне форума Ответить с цитированием
Старый 03.03.2016, 22:14   #3
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Следуя коду из интернета, данная переменная может не только тип Boolean принимать. Проверяйте какой именно у нее тип.
koljsch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WMI AppData Общие вопросы Delphi 13 06.02.2015 16:00
WMI No_Comments Помощь студентам 3 19.10.2012 22:37
delphi + WMI fate Общие вопросы Delphi 2 07.10.2011 08:27
Преобразование функцией _wtoi(): не все символы достались целому числу malor Общие вопросы C/C++ 11 27.06.2011 22:29
блокировка WMI north Win Api 2 15.02.2009 16:54