2016-06-08 4 views
-2

Хотя я понимаю, как я подключиться к WMI и получить это информация необходима, я не могу понять, что наша потребность в этом в то время как петля (while oEnum.Next(1, FWbemObject, iValue) = 0 do )? От How to get the installed video card (Delphi):Доступ к WMI из 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. Этот объект поддерживает итерацию через IEnumVARIANT, который открывается через свойство _NewEnum.

Использование нумератора является единственным способом для перебора результатов возвращенного объекта (некоторые языков, как VBScript реализовать скрытое неявное нумератор, и вы можете получить доступ к такой информации, используя for..in петли на возвращаемом объект). В Delphi для доступа к этому перечислителю вы должны указать свойство _NewEnum возвращаемого объекта на интерфейс IEnumVariant.

Затем вы можете перебирать данные, используя метод Next. Результат этого метода описана как так

  • S_OK количество элементов возвращаемых Celt.
  • S_FALSE Количество возвращенных элементов меньше celt.

Celt: это имя первого параметра и указать число элементов, которые будут получены по методу Next.

В этом случае мы запрашивающие 1 элемент во время (проверьте первый параметр функции IEnumVARIANT.Next), так что если возвращение функции S_OK (0) означает, что, когда функция успешно возвращается 1 элемент коллекции.

1

Компьютеры могут иметь более одной видеокарты. Этот цикл просто повторяется через каждый.

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.

+0

Для IEnumVARIANT.Next сказано, что он может возвращать либо 'S_OK', либо' S_FALSE'. [Ссылка здесь] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms221369 (v = vs.85) .aspx) –

+0

@TomBrunberg, Спасибо, что он уже редактировал :) –

Смежные вопросы