6

你知道为什么下面的代码块会在某些计算机上否定“无法将类型的变体(Null)转换为类型(OleStr)”,不是所有计算机,而是十分之三的计算机都会生成错误消息。

在此处输入图像描述

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

const
  wbemFlagForwardOnly = $00000020;

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

4 回答 4

12

当 WMI 属性的值返回 null 时,您的代码将失败。您可以解决此问题,在强制转换或转换为字符串之前检查属性是否具有空值。对于此任务,您可以使用该VarIsNull函数或仅使用该VarToStr方法将变体安全地转换为字符串。

 LNode := ClientForm.TreeView1.Items.AddChild(Node, 
              Format('%s',[VarToStr(FWbemObject.Name)]));
 LNode2 := ClientForm.TreeView1.Items.AddChild(LNode, 
              Format('%s',[VarToStr(FWbemObject.Version)]));
于 2013-04-25T21:39:33.057 回答
2

为避免错误消息,请执行

NullStrictConvert := 假;// 避免 NULL OLE 转换错误

于 2013-11-25T12:51:01.893 回答
2

如果要将 null 变量自动转换为空字符串、0 整数或 false 布尔值,请将NullStrictConvert(unit System.Variants) 设置为False

于 2013-04-26T06:42:41.290 回答
1

有时,FWbemObject 不是 NULL,但会引发异常:“Can'nt convert an Array of Variant in OleStr”

例如:BiosVersion(是一个数组)要解决它,试试这个:

对于 I := VarArrayLowBound (FWbemObject.BIOSVersion, 1) 到 VarArrayHighBound (FWbemObject.BIOSVersion, 1) 做 L.Add( VarToStr (FWbemObject.BIOSVersion[i]) );

问候

泽鲁基

于 2015-09-30T09:40:06.860 回答