访问德尔福
的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;
的SWbemServices.ExecQuery
方法用WMI语句的结果返回一个集合。该对象支持通过_NewEnum
属性公开的IEnumVARIANT
迭代。
使用枚举是在返回对象的结果进行迭代(有些语言,如VBScript中的唯一途径实现隐藏隐枚举,您可以使用的for..in环比恢复访问这些信息目的)。在Delphi中有权访问这样的枚举器,您必须将返回对象的_NewEnum
属性转换为IEnumVariant
接口。
然后您可以使用Next
方法迭代数据。此方法的结果是记录像这样
- S_OK返回的元素的数目是凯尔特。
- S_FALSE返回的元素数小于celt。
凯尔特:是所述第一参数的名称和指示用于Next
方法要检索的元素数。
在这种情况下,我们在请求1个元素(检查函数的第一个参数),所以如果函数的返回值是S_OK(0)意味着函数返回成功的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
对于IEnumVARIANT.Next,据说它可以返回'S_OK'或'S_FALSE'。 [链接这里](https://msdn.microsoft.com/en-us/library/windows/desktop/ms221369(v = vs.85).aspx) –
@TomBrunberg,谢谢你已经发现,编辑:) –
可能有多个视频卡。 –
和技术答案是什么?我的意思是为什么它= 0? –
我没有把它当作你的问题来解释。我把它理解为“为什么这个循环在这里?” –