Compartir a través de


Recopilaciones de dispositivos devueltas por búsquedas sincrónicas

Las colecciones de dispositivos son objetos que contienen uno o varios objetos Device. Una colección Device expone la interfaz IUPnPDevices que proporciona métodos y propiedades para recorrer la colección y extraer objetos de dispositivo individuales.

Ejemplo de VBScript

Las aplicaciones VBScript pueden acceder a los objetos de la colección de dos maneras. En primer lugar, pueden atravesar los elementos secuencialmente mediante un para ... Cada... siguiente bucle tal como se muestra en el ejemplo siguiente:

for each deviceObj in devices
    MsgBox(deviceObj.FriendlyName)
next

En este ejemplo, se supone que la variable devices se ha inicializado con el resultado de una búsqueda anterior. El bucle recorre los objetos Device de la colección, asignando la variable deviceObj el valor de cada objeto Device a su vez. El cuerpo del bucle puede contener código que procesa el objeto Device.

Ejemplo de C++

En el ejemplo siguiente se muestra el código de C++ necesario para acceder a los objetos de una colección de objetos de dispositivo. La función mostrada, TraverseCollection, recibe un puntero a la interfaz IUPnPDevices como parámetro de entrada. El método FindByType podría devolver este puntero de interfaz u otros métodos Find del 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;
}

El primer paso consiste en solicitar un nuevo enumerador para la colección mediante la propiedad _NewEnum . Esto devuelve un enumerador como interfaz IUnknown . El código de ejemplo invoca IUnknown::QueryInterface para obtener la interfaz IEnumVARIANT . A continuación, el código de ejemplo establece el enumerador al principio de la colección invocando el método IEnumVARIANT::Reset . Por último, el código de ejemplo invoca el método IEnumVARIANT::Next para recorrer la colección. Los objetos de dispositivo de la colección están incluidos en estructuras VARIANT . Estas estructuras contienen punteros a interfaces IDispatch en los objetos de dispositivo. Para obtener la interfaz IUPnPDevice , el código de ejemplo invoca QueryInterface en la interfaz IDispatch .