您知道为什么下面的代码块会否定某些计算机上的“无法将类型(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');
非常感谢你的帮助。
4条答案
按热度按时间1yjd4xko1#
当WMI属性值返回空时,您的代码将失败。您可以修复此问题,在强制转换或转换为字符串之前检查属性是否有空值。对于此任务,您可以使用
VarIsNull
函数或只使用VarToStr
方法将变量安全地转换为如下所示的字符串。crcmnpdw2#
如果希望将空变量自动转换为空字符串、0整数或假布尔值,请将
NullStrictConvert
(单位为System.Variants)设置为False
。wgx48brx3#
要避免出现错误消息,请执行以下操作
NullStrictConvert:=FALSE;//避免空OLE转换错误
7cjasjjr4#
有时,FWbemObject不为空,但会引发异常:“无法在OleStr中转换变量数组”
举个例子:BiosVersion(是一个数组)要解决这个问题,试试这个:
对于i:=VarArrayLowBound(FWbemObject.BIOSVersion,1)toVarArrayHighBound(FWbemObject.BIOSVersion,1)做L.Add(VarToStr(FWbemObt.BIOSVersion[i]));
问候
泽鲁基