Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.01.2017, 18:07
delphi-programmer-2007 delphi-programmer-2007 вне форума
Прохожий
 
Регистрация: 16.01.2017
Сообщения: 12
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Could not convert variant of type Dispatch into type(String) - ошибка

Имеется программа с привязкой к материнской плате и процессору, все нормально в целом работает.

Привязка выполняется на основе функции GetWMIString (код на Delphi 7 приведен ниже),

В целом все нормально работает на 99% компьютерах.

Но есть одна проблема, которая проявляется на 1% компьютеров и совсем непонятно, что с этим делать.


Выскакивает ошибка

could not convert variant of type Dispatch into type(String)

- причем выскакивает она в строке, которая в коде функции помечена соответствующим комментарием.

Что было проверено:


Пытался копать - проверил следующее:

ShowMessage(inttostr(VarType(colItem.Properties_.I tem(wmiProperty, 0)))) - выдет 9 - то есть тип проблемного выражения, которое не присваивается переменной result, varDispatch

Там точно не NULL.

Вместо VarIsNull(colItem.Properties_.Item(wmiProperty, 0)) пробовал еще VarIsClear(colItem.Properties_.Item(wmiProperty, 0)) - то же самое - попадает на 2-ю ветку.

Дальше куда копать - непонятно


Что интересно, функция GetWMIstring иногда работает (даже на этих проблемных 1% компьютерах) - например,

s1 := GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','Product') //работает
s2 := GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','Manufacturer') //работает
s3 := GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','SerialNumber') //НЕ РАБОТАЕТ

В чем может быть причина?



Код функции:

Код:
function GetWMIstring0(wmiHost, root, wmiClass, wmiProperty: string): string;
var
   objWMIService: OLEVariant;
   colItems: OLEVariant;
   colItem: OLEVariant;
   oEnum: IEnumvariant;
   iValue: LongWord;
function GetWMIObject(const objectName: String): IDispatch;
var
   chEaten: Integer;
   BindCtx: IBindCtx;
   Moniker: IMoniker;
begin
   OleCheck(CreateBindCtx(0, bindCtx));
   OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); //здесь ошибка
   OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;
begin
   objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s',[wmiHost,root]));
   colItems      := objWMIService.ExecQuery(Format('SELECT * FROM %s',[wmiClass]),'WQL',0);
   oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
   while oEnum.Next(1, colItem, iValue) = 0 do begin
      if VarIsNull(colItem.Properties_.Item(wmiProperty, 0)) then
         Result := 'NULL'
      else begin
         //при выполнении следующей команды будет ошибка "could not convert variant of type Dispatch into type(String)"
         Result := colItem.Properties_.Item(wmiProperty, 0)
      end
   end;
end;
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter