同步搜索返回的设备集合

设备集合是包含一个或多个 Device 对象的对象。 Device 集合公开 IUPnPDevices 接口,该接口提供用于遍历集合和提取单个设备对象的方法和属性。

VBScript 示例

VBScript 应用程序可以通过两种方式访问集合中的对象。 首先,他们可以使用 for ... 每个。。。下一个循环,如以下示例所示:

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

在此示例中,假定 devices 变量已使用先前搜索的结果进行初始化。 循环遍历集合中的 Device 对象,依次向变量 deviceObj 分配每个 Device 对象的值。 循环的主体可以包含处理 Device 对象的代码。

C++ 示例

以下示例演示访问设备对象集合中的对象所需的 C++ 代码。 显示的函数 TraverseCollection 接收指向 IUPnPDevices 接口的指针作为输入参数。 此接口指针可由 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