从Delphi访问WMI

时间:2016-06-08 16:34:06

标签: delphi wmi

虽然我了解如何连接到WMI并获取所需信息,但我无法理解我们对此 while循环的需求是什么(while oEnum.Next(1, FWbemObject, iValue) = 0 do )?来自How to get the installed video card ( Delphi)

FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
FWbemObjectSet:= FWMIService.ExecQuery('SELECT Name,PNPDeviceID  FROM Win32_VideoController','WQL',wbemFlagForwardOnly);
oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
  Writeln(Format('Name           %s',[String(FWbemObject.Name)]));// String
  Writeln(Format('PNPDeviceID    %s',[String(FWbemObject.PNPDeviceID)]));//   String        
  Writeln;
  FWbemObject:=Unassigned;
end;

3 个答案:

答案 0 :(得分:3)

SWbemServices.ExecQuery方法返回一个带有WMI句子结果的集合。此对象支持通过_NewEnum属性公开的IEnumVARIANT的迭代。

使用枚举器是迭代返回对象结果的唯一方法(某些语言,如 vbscript 实现隐藏的隐式枚举器,您可以使用来访问此类信息。在循环返回的对象)。在Delphi中,要访问此类枚举器,必须将返回对象的_NewEnum属性强制转换为IEnumVariant接口。

然后,您可以使用Next方法迭代数据。这种方法的结果记录如下

  • S_OK 返回的元素数量为 celt
  • S_FALSE 返回的元素数量少于 celt

celt :是第一个参数的名称,表示要为Next方法检索的元素数。

在这种情况下,我们一次请求1个元素(检查IEnumVARIANT.Next函数的第一个参数),所以如果函数返回S_OK(0)意味着函数返回成功1个元素的集合。

答案 1 :(得分:1)

计算机可能有多个视频卡。这个循环只是遍历每个循环。

答案 2 :(得分:1)

可能有多个视频卡,因此循环。

oEnumIENUMVARIANTNext返回HResult,在这种情况下可以是:

S_OK    The number of elements returned is celt.
S_FALSE The number of elements returned is less than celt.

注意:S_OK转换为0,S_FALSE为1.