你知道为什么下面的代码块会在某些计算机上否定“无法将类型(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');
非常感谢你的帮助。
答案 0 :(得分: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 :(得分:2)
要避免出现错误消息
NullStrictConvert:= false; //避免NULL OLE转换错误
答案 2 :(得分:1)
如果要将变量自动转换为空字符串,0整数或假布尔值,请将NullStrictConvert
(单位System.Variants)设置为False
。
答案 3 :(得分:1)
有时,FWbemObject不是NULL但会引发异常: “无法在OleStr中转换Variant数组”
例如:BiosVersion(是一个数组) 要解决它,试试这个:
表示I:= VarArrayLowBound (FWbemObject.BIOSVersion,1)到 VarArrayHighBound (FWbemObject.BIOSVersion,1) L.Add( VarToStr (FWbemObject.BIOSVersion [i]));
此致
Zerrouki