同步搜尋傳回的裝置集合
裝置集合是包含一或多個 Device 物件的物件。 Device 集合會公開 IUPnPDevices 介面,以提供周遊集合及擷取個別裝置物件的方法和屬性。
VBScript 範例
VBScript 應用程式可以透過兩種方式存取集合中的物件。 首先,他們可以使用 for ... 循序周遊元素 每個。。。next 迴圈,如下列範例所示:
for each deviceObj in devices
MsgBox(deviceObj.FriendlyName)
next
在此範例中,假設 devices 變數已使用先前搜尋的結果初始化。 迴圈會逐步執行集合中的 Device 物件,然後指派變數 deviceObj 每個 Device 物件的值。 迴圈主體可以包含處理 Device 物件的程式碼。
C++ 範例
下列範例顯示存取裝置物件集合中物件所需的 C++ 程式碼。 Shown the function shown, TraverseCollection, receives a pointer to the IUPnPDevices interface as an input parameter. 此介面指標可由 Device Finder 物件的 FindByType方法或其他 Find 方法傳回。
#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;
}
第一個步驟是使用 _NewEnum 屬性要求集合的新列舉值。 這會傳回列舉值做為 IUnknown 介面。 範例程式碼會叫用 IUnknown::QueryInterface 來取得 IEnumVARIANT 介面。 然後,範例程式碼會叫用 IEnumVARIANT::Reset 方法,將列舉值設定為集合的開頭。 最後,範例程式碼會叫用 IEnumVARIANT::Next 方法來周遊集合。 集合中的裝置物件包含在 VARIANT 結構內。 這些結構包含裝置物件上 IDispatch 介面的指標。 為了取得IUPnPDevice介面,範例程式碼會在IDispatch介面上叫用QueryInterface。