Von synchronen Suchvorgängen zurückgegebene Gerätesammlungen
Gerätesammlungen sind Objekte, die mindestens ein Geräteobjekt enthalten. Eine Gerätesammlung macht die IUPnPDevices-Schnittstelle verfügbar, die Methoden und Eigenschaften zum Durchlaufen der Sammlung und Extrahieren einzelner Geräteobjekte enthält.
VBScript-Beispiel
VBScript-Anwendungen können auf zwei Arten auf die Objekte in der Auflistung zugreifen. Zunächst können sie die Elemente sequenziell durchlaufen, indem sie ein für ... Jeder... Next-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 durchfing die Geräteobjekte in der Sammlung und weist der Variablen deviceObj wiederum den Wert jedes Geräteobjekts 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 gezeigte 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 im Anfordern eines neuen Enumerators für die Auflistung mithilfe der _ NewEnum-Eigenschaft. Dadurch wird ein Enumerator als IUnknown-Schnittstelle zurückgegeben. Der Beispielcode ruft IUnknown::QueryInterface auf, um die IEnumVARIANT-Schnittstelle zu erhalten. Der Beispielcode legt dann den Enumerator auf den Anfang der Auflistung fest, indem die IEnumVARIANT::Reset-Methode aufruft. Schließlich ruft der Beispielcode die IEnumVARIANT::Next-Methode auf, um die Auflistung zu durchlaufen. Die Geräteobjekte in der Sammlung sind in VARIANT-Strukturen enthalten. Diese Strukturen enthalten Zeiger auf IDispatch-Schnittstellen auf den Geräteobjekten. Um die IUPnPDevice-Schnittstelle zu erhalten, ruft der Beispielcode QueryInterface auf der IDispatch-Schnittstelle auf.