2016-06-08 126 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,謝謝你已經發現,編輯:) –