delphi – 无法将类型(Null)的变体转换为类型(OleStr)

你知道为什么下面的代码块会在某些计算机上否定“无法将类型(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,[String(FWbemObject.Version)]));
      FWbemObject:=Unassigned;
    end;

end;

然后在FormCreate中执行该函数

GETWMIstringSW('Win32_Product','Name');

非常感谢你的帮助.

解决方法

当WMI属性的值返回null时,您的代码将失败.您可以解决此问题,在转换或转换为字符串之前检查属性是否具有空值.对于此任务,您可以使用 VarIsNull函数或仅使用 VarToStr方法将变量安全地转换为字符串,如此.
LNode := ClientForm.TreeView1.Items.AddChild(Node,[VarToStr(FWbemObject.Name)]));
 LNode2 := ClientForm.TreeView1.Items.AddChild(LNode,[VarToStr(FWbemObject.Version)]));

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...