Coleções de dispositivos retornadas por pesquisas síncronas
Coleções de dispositivos são objetos que contêm um ou mais objetos Device. Uma coleção Device expõe a interface IUPnPDevices que fornece métodos e propriedades para percorrer a coleção e extrair objetos de dispositivo individuais.
Exemplo de VBScript
Os aplicativos VBScript podem acessar os objetos na coleção de duas maneiras. Primeiro, eles podem percorrer os elementos sequencialmente usando um para ... Cada... próximo loop, conforme mostrado no exemplo a seguir:
for each deviceObj in devices
MsgBox(deviceObj.FriendlyName)
next
Neste exemplo, supõe-se que a variável de dispositivos tenha sido inicializada com o resultado de uma pesquisa anterior. O loop percorre os objetos Device na coleção, atribuindo à variável deviceObj o valor de cada objeto Device. O corpo do loop pode conter o código que processa o objeto Device.
Exemplo do C++
O exemplo a seguir mostra o código C++ necessário para acessar os objetos em uma coleção de objetos de dispositivo. A função mostrada, TraverseCollection, recebe um ponteiro para a interface IUPnPDevices como um parâmetro de entrada. Esse ponteiro de interface pode ser retornado pelo método FindByType ou outros métodos Find do objeto Device Finder.
#include <windows.h>
#include <upnp.h>
#pragma comment(lib, "oleaut32.lib")
HRESULT TraverseCollection(IUPnPDevices * pDevices)
{
IUnknown * pUnk = NULL;
HRESULT hr = pDevices->get__NewEnum(&pUnk);
if (SUCCEEDED(hr))
{
IEnumVARIANT * pEnumVar = NULL;
hr = pUnk->QueryInterface(IID_IEnumVARIANT, (void **) &pEnumVar);
if (SUCCEEDED(hr))
{
VARIANT varCurDevice;
VariantInit(&varCurDevice);
pEnumVar->Reset();
// Loop through each device in the collection
while (S_OK == pEnumVar->Next(1, &varCurDevice, NULL))
{
IUPnPDevice * pDevice = NULL;
IDispatch * pdispDevice = V_DISPATCH(&varCurDevice);
if (SUCCEEDED(pdispDevice->QueryInterface(IID_IUPnPDevice, (void **) &pDevice)))
{
// Do something interesting with pDevice
BSTR bstrName = NULL;
if (SUCCEEDED(pDevice->get_FriendlyName(&bstrName)))
{
OutputDebugStringW(bstrName);
SysFreeString(bstrName);
}
}
VariantClear(&varCurDevice);
pDevice->Release();
}
pEnumVar->Release();
}
pUnk->Release();
}
return hr;
}
A primeira etapa é solicitar um novo enumerador para a coleção usando a propriedade _NewEnum . Isso retorna um enumerador como a interface IUnknown . O código de exemplo invoca IUnknown::QueryInterface para obter a interface IEnumVARIANT . Em seguida, o código de exemplo define o enumerador para o início da coleção invocando o método IEnumVARIANT::Reset . Por fim, o código de exemplo invoca o método IEnumVARIANT::Next para percorrer a coleção. Os objetos de dispositivo na coleção estão contidos em estruturas VARIANT . Essas estruturas contêm ponteiros para interfaces IDispatch nos objetos do dispositivo. Para obter a interface IUPnPDevice , o código de exemplo invoca QueryInterface na interface IDispatch .