Freigeben über


Gerätesammlungen, die von synchronen Suchvorgängen zurückgegeben werden

Gerätesammlungen sind Objekte, die mindestens ein Device-Objekt enthalten. Eine Device-Auflistung macht die IUPnPDevices-Schnittstelle verfügbar, die Methoden und Eigenschaften zum Durchlaufen der Auflistung und Extrahieren einzelner Geräteobjekte bereitstellt.

VBScript-Beispiel

VBScript-Anwendungen können auf zwei Arten auf die Objekte in der Auflistung zugreifen. Erstens können sie die Elemente sequenziell mit einem für ... Jeder... nächste Schleife, wie im folgenden Beispiel gezeigt:

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

In diesem Beispiel wird davon ausgegangen, dass die Gerätevariable mit dem Ergebnis einer vorherigen Suche initialisiert wurde. Die Schleife durchläuft die Device-Objekte in der Auflistung und weist der Variablen deviceObj wiederum den Wert jedes Device-Objekts zu. Der Text der Schleife kann Code enthalten, der das Device-Objekt verarbeitet.

C++-Beispiel

Das folgende Beispiel zeigt den C++-Code, der für den Zugriff auf die Objekte in einer Auflistung von Geräteobjekten erforderlich ist. Die angezeigte Funktion TraverseCollection empfängt einen Zeiger auf die IUPnPDevices-Schnittstelle als Eingabeparameter. Dieser Schnittstellenzeiger kann von der FindByType-Methode oder anderen Find-Methoden des Device Finder-Objekts zurückgegeben werden.

#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;
}

Der erste Schritt besteht darin, mithilfe der Eigenschaft _NewEnum einen neuen Enumerator für die Auflistung anzufordern. Dadurch wird ein Enumerator als IUnknown-Schnittstelle zurückgegeben. Der Beispielcode ruft IUnknown::QueryInterface auf, um die IEnumVARIANT-Schnittstelle abzurufen. Der Beispielcode legt dann den Enumerator auf den Anfang der Auflistung fest, indem die IEnumVARIANT::Reset-Methode aufgerufen wird. Schließlich ruft der Beispielcode die IEnumVARIANT::Next-Methode auf, um die Auflistung zu durchlaufen. Die Geräteobjekte in der Auflistung sind in VARIANT-Strukturen enthalten. Diese Strukturen enthalten Zeiger auf IDispatch-Schnittstellen auf den Geräteobjekten. Um die IUPnPDevice-Schnittstelle abzurufen, ruft der Beispielcode QueryInterface auf der IDispatch-Schnittstelle auf.