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.