同期検索によって返されるデバイス コレクション
デバイス コレクションは、1 つ以上の Device オブジェクトを含むオブジェクトです。 Device コレクションは、コレクションを走査し、個々のデバイス オブジェクトを抽出するためのメソッドとプロパティを提供する IUPnPDevices インターフェイスを公開します。
VBScript の例
VBScript アプリケーションは、2 つの方法でコレクション内のオブジェクトにアクセスできます。 最初に、 の を使用して要素を順番に走査できます。 各。。。次の例に示すように、next ループ。
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 を呼び出します。