无法将类型(Null)的变量转换为类型(OleStr)

55ooxyrt  于 2022-09-21  发布在  其他
关注(0)|答案(4)|浏览(598)

您知道为什么下面的代码块会否定某些计算机上的“无法将类型(Null)的变量转换为类型(OleStr)的变量”,而不是所有计算机都会生成错误消息吗?

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

const
  wbemFlagForwardOnly = B1a0a1b20;

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');

非常感谢你的帮助。

1yjd4xko

1yjd4xko1#

当WMI属性值返回空时,您的代码将失败。您可以修复此问题,在强制转换或转换为字符串之前检查属性是否有空值。对于此任务,您可以使用VarIsNull函数或只使用VarToStr方法将变量安全地转换为如下所示的字符串。

LNode := ClientForm.TreeView1.Items.AddChild(Node, 
              Format('%s',[VarToStr(FWbemObject.Name)]));
 LNode2 := ClientForm.TreeView1.Items.AddChild(LNode, 
              Format('%s',[VarToStr(FWbemObject.Version)]));
crcmnpdw

crcmnpdw2#

如果希望将空变量自动转换为空字符串、0整数或假布尔值,请将NullStrictConvert(单位为System.Variants)设置为False

wgx48brx

wgx48brx3#

要避免出现错误消息,请执行以下操作

NullStrictConvert:=FALSE;//避免空OLE转换错误

7cjasjjr

7cjasjjr4#

有时,FWbemObject不为空,但会引发异常:“无法在OleStr中转换变量数组”

举个例子:BiosVersion(是一个数组)要解决这个问题,试试这个:

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

问候

泽鲁基

相关问题