Condividi tramite


Raccolte di dispositivi restituite dalle ricerche sincrone

Le raccolte di dispositivi sono oggetti che contengono uno o più oggetti Device. Un insieme Device espone l'interfaccia IUPnPDevices che fornisce metodi e proprietà per attraversare la raccolta ed estrarre singoli oggetti dispositivo.

Esempio VBScript

Le applicazioni VBScript possono accedere agli oggetti nella raccolta in due modi. Prima di tutto, possono attraversare gli elementi in sequenza usando un per ... Ogni... ciclo successivo, come illustrato nell'esempio seguente:

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

In questo esempio si presuppone che la variabile dispositivi sia stata inizializzata con il risultato di una ricerca precedente. Il ciclo passa attraverso gli oggetti Device nell'insieme, assegnando al dispositivo variabileObj il valore di ogni oggetto Device a sua volta. Il corpo del ciclo può contenere codice che elabora l'oggetto Device.

Esempio C++

Nell'esempio seguente viene illustrato il codice C++ necessario per accedere agli oggetti in una raccolta di oggetti dispositivo. La funzione illustrata, TraverseCollection, riceve un puntatore all'interfaccia IUPnPDevices come parametro di input. Questo puntatore di interfaccia può essere restituito dal metodo FindByType o da altri metodi Find dell'oggetto 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;
}

Il primo passaggio consiste nel richiedere un nuovo enumeratore per la raccolta usando la proprietà _NewEnum . Restituisce un enumeratore come interfaccia IUnknown . Il codice di esempio richiama IUnknown::QueryInterface per ottenere l'interfaccia IEnumVARIANT . Il codice di esempio imposta quindi l'enumeratore all'inizio della raccolta richiamando il metodo IEnumVARIANT::Reset . Infine, il codice di esempio richiama il metodo IEnumVARIANT::Next per attraversare la raccolta. Gli oggetti dispositivo nella raccolta sono contenuti all'interno di strutture VARIANT . Queste strutture contengono puntatori alle interfacce IDispatch negli oggetti dispositivo. Per ottenere l'interfaccia IUPnPDevice , il codice di esempio richiama QueryInterface nell'interfaccia IDispatch .