Не удалось преобразовать вариант типа (Null) в тип (OleStr)

знаете ли вы, почему блок кода ниже отрицает "не удалось преобразовать вариант типа (Null) в тип (OleStr)" на некоторых компьютерах, не все из них, но 3 из десяти компьютеров генерируют сообщение об ошибке.

enter image description here

function GetWMIstringSW(const WMIClass, WMIProperty:string): string;

const
  wbemFlagForwardOnly = 000020;

var
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
  LNode         : TTreeNode;
  LNode2        : TTreeNode;

begin
  Result:='';
  FWbemObjectSet:= FWMIService.ExecQuery(Format('Select %s from %s',[WMIProperty, WMIClass]),'WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;

  while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      if not VarIsNull(FWbemObject.Properties_.Item(WMIProperty).Value) then
      Result:=FWbemObject.Properties_.Item(WMIProperty).Value;
      LNode := ClientForm.TreeView1.Items.AddChild(Node, Format('%s',[String(FWbemObject.Name)]));

      LNode2 := ClientForm.TreeView1.Items.AddChild(LNode, Format('%s',[String(FWbemObject.Version)]));
      FWbemObject:=Unassigned;
    end;

end;

функция затем выполняется в FormCreate:

GETWMIstringSW('Win32_Product','Name');

большое спасибо за вашу помощь.

4 ответов


код завершается ошибкой, когда значение свойства WMI возвращает null. Это можно исправить, проверив, имеет ли свойство значение null перед приведением или преобразованием в строку. Для этой задачи вы можете использовать VarIsNull


чтобы избежать сообщения об ошибке do

NullStrictConvert: = false; / / избегайте ошибки преобразования null OLE


иногда FWbemObject не является нулевым, но исключение-raise : "Не удается преобразовать массив вариантов в OleStr"

Как пример : в BiosVersion (массив) Чтобы решить эту проблему, попробуйте следующее:

для I:= VarArrayLowBound(FWbemObject.BIOSVersion, 1) к VarArrayHighBound(FWbemObject.BIOSVersion, 1) не Л. Добавить( VarToStr(FWbemObject.BIOSVersion[я]) );

в отношении

готовить после тяжелого трудового


Если вы хотите, чтобы нулевые варианты автоматически преобразовывались в пустые строки, 0 целых чисел или ложные логические значения, установите NullStrictConvert (системный блок.Варианты) до False.