2013-04-25 684 views
7

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

enter image description here

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

非常感谢你的帮助。

+0

将变异为空? – 2013-04-25 21:35:36

+0

为什么不使用准备好的'MagWMI'包装? – 2013-04-26 10:30:23

回答

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)])); 
1

如果你想空的变体可自动转换为空字符串,整数0,或假布尔值,NullStrictConvert(单位System.Variants)设置为true。

2

为了避免该错误消息做

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

1

有时,FWbemObject不是NULL但一个例外是加注: “Can'nt转换变体的阵列中OLESTR”

作为为例:所述BiosVersion(是一个数组) 为了解决这个问题,试试这个:

因为我:= VarArrayLowBound(FWbemObject.BIOSVersion,1)VarArrayHighBound(FWbemObject.BIOSVersion,1)做 L.Add(VarToStr(FWbemObject。 BIOSV ersion [i]));

问候

Zerrouki

相关问题