Partager via


Collections d’appareils retournées par des recherches synchrones

Les collections d’appareils sont des objets qui contiennent un ou plusieurs objets Device. Une collection Device expose l’interface IUPnPDevices qui fournit des méthodes et des propriétés permettant de parcourir la collection et d’extraire des objets d’appareil individuels.

Exemple VBScript

Les applications VBScript peuvent accéder aux objets de la collection de deux manières. Tout d’abord, ils peuvent parcourir les éléments séquentiellement à l’aide d’un pour ... Chaque... boucle suivante, comme indiqué dans l’exemple suivant :

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

Dans cet exemple, la variable d’appareils est supposée avoir été initialisée avec le résultat d’une recherche précédente. La boucle traverse les objets Device de la collection, affectant à la variable deviceObj la valeur de chaque objet Device à son tour. Le corps de la boucle peut contenir du code qui traite l’objet Device.

Exemple C++

L’exemple suivant montre le code C++ requis pour accéder aux objets d’une collection d’objets d’appareil. La fonction indiquée, TraverseCollection, reçoit un pointeur vers l’interface IUPnPDevices en tant que paramètre d’entrée. Ce pointeur d’interface peut être retourné par la méthode FindByType ou d’autres méthodes Find de l’objet 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;
}

La première étape consiste à demander un nouvel énumérateur pour la collection à l’aide de la propriété _NewEnum . Cela retourne un énumérateur en tant qu’interface IUnknown . L’exemple de code appelle IUnknown::QueryInterface pour obtenir l’interface IEnumVARIANT . L’exemple de code définit ensuite l’énumérateur au début de la collection en appelant la méthode IEnumVARIANT::Reset . Enfin, l’exemple de code appelle la méthode IEnumVARIANT::Next pour parcourir la collection. Les objets d’appareil de la collection sont contenus dans des structures VARIANT . Ces structures contiennent des pointeurs vers les interfaces IDispatch sur les objets d’appareil. Pour obtenir l’interface IUPnPDevice , l’exemple de code appelle QueryInterface sur l’interface IDispatch .