2016-06-08 133 views
-2

的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; 
+0

可能有多个视频卡。 –

+0

和技术答案是什么?我的意思是为什么它= 0? –

+0

我没有把它当作你的问题来解释。我把它理解为“为什么这个循环在这里?” –

回答

3

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

使用枚举是在返回对象的结果进行迭代(有些语言,如VBScript中的唯一途径实现隐藏隐枚举,您可以使用的for..in环比恢复访问这些信息目的)。在Delphi中有权访问这样的枚举器,您必须将返回对象的_NewEnum属性转换为IEnumVariant接口。

然后您可以使用Next方法迭代数据。此方法的结果是记录像这样

  • S_OK返回的元素的数目是凯尔特
  • S_FALSE返回的元素数小于celt

凯尔特:是所述第一参数的名称和指示用于Next方法要检索的元素数。

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

1

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

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

+0

对于IEnumVARIANT.Next,据说它可以返回'S_OK'或'S_FALSE'。 [链接这里](https://msdn.microsoft.com/en-us/library/windows/desktop/ms221369(v = vs.85).aspx) –

+0

@TomBrunberg,谢谢你已经发现,编辑:) –