虽然我了解如何连接到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;
答案 0 :(得分:3)
SWbemServices.ExecQuery
方法返回一个带有WMI句子结果的集合。此对象支持通过_NewEnum
属性公开的IEnumVARIANT
的迭代。
使用枚举器是迭代返回对象结果的唯一方法(某些语言,如 vbscript 实现隐藏的隐式枚举器,您可以使用来访问此类信息。在循环返回的对象)。在Delphi中,要访问此类枚举器,必须将返回对象的_NewEnum
属性强制转换为IEnumVariant
接口。
然后,您可以使用Next
方法迭代数据。这种方法的结果记录如下
celt :是第一个参数的名称,表示要为Next
方法检索的元素数。
在这种情况下,我们一次请求1个元素(检查IEnumVARIANT.Next
函数的第一个参数),所以如果函数返回S_OK(0)意味着函数返回成功1个元素的集合。
答案 1 :(得分:1)
计算机可能有多个视频卡。这个循环只是遍历每个循环。
答案 2 :(得分:1)
可能有多个视频卡,因此循环。
oEnum
是IENUMVARIANT,Next返回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.