Could not convert variant of type (Null) into type (OleStr)

delphi, delphi-xe2, ole, wmi

Solution

You code fails when the value of a WMI property returns null. You can fix this, checking if the property has a null value before to cast or convert to an string. For this task you can use the `VarIsNull` function or just use the `VarToStr` method to safely convert variants to strings like so.

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

Problem

Do you know why the block of code bellow will negate the "Could not convert variant of type (Null) into type (OleStr)" on some computers, not all of them but 3 out of ten computers generate the error message. ``` 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; ``` The function is then executed at FormCreate: ``` GETWMIstringSW('Win32_Product','Name'); ``` Thank you so much for your help.

Original source