Von Bedeutung
このトピックのコンテンツとサンプル コードは古く、現在サポートされていません。 現在のドライバー開発ツールチェーンでは動作しない場合があります。
このトピックには、拡張ユニットをサポートするために使用できるサンプル アプリケーション コードが含まれています。
アプリケーションは 、IKsTopologyInfo::CreateNodeInstance を 使用してインターフェイスにアクセスし、その後にノード オブジェクトの QueryInterface を呼び出して、必要な COM API を取得します。 詳細については、「 IKsTopologyInfo」を参照してください。
アプリケーション ソースに、任意の名前の TestApp.cpp に次のコードを含めます。
TestApp.cpp に、拡張ユニットでの Autoupdate イベントをサポートするコードも含めてください。
// pUnkOuter is the unknown associated with the base filter
hr = pUnkOuter->QueryInterface(__uuidof(IKsTopologyInfo),
(void **) &pKsTopologyInfo);
if (!SUCCEEDED(hr))
{
printf("Unable to obtain IKsTopologyInfo %x\n", hr);
goto errExit;
}
hr = FindExtensionNode(pKsTopologyInfo,
GUID_EXTENSION_UNIT_DESCRIPTOR,
&dwExtensionNode);
if (FAILED(hr))
{
printf("Unable to find extension node : %x\n", hr);
goto errExit;
}
hr = pKsTopologyInfo->CreateNodeInstance(
dwExtensionNode,
__uuidof(IExtensionUnit),
(void **) &pExtensionUnit);
if (FAILED(hr))
{
printf("Unable to create extension node instance : %x\n", hr);
goto errExit;
}
hr = pExtensionUnit->get_PropertySize(1, &ulSize);
if (FAILED(hr))
{
printf("Unable to find property size : %x\n", hr);
goto errExit;
}
pbPropertyValue = new BYTE[ulSize];
if (!pbPropertyValue)
{
printf("Unable to allocate memory for property value\n");
goto errExit;
}
hr = pExtensionUnit->get_Property(1,ulSize, pbPropertyValue);
if (FAILED(hr))
{
printf("Unable to get property value\n");
goto errExit;
}
// assume the property value is an integer
ASSERT(ulSize == 4);
printf("The value of property 1 = %d\n", *((int *)
pbPropertyValue));
この場合、 pUnkOuter は USB ビデオ クラス (UVC) デバイスを表すキャプチャ フィルターへのポインターである必要があります。 キャプチャ フィルターをフィルター グラフに追加した後、このサンプル コードに示すように 、IKsTopologyInfo インターフェイスのフィルターに対してクエリを実行できます。
FindExtensionNode 関数のコードを記述して、必要な拡張ユニット ノードを見つけ、その ID を dwExtensionNode で返します。 この ID は、このサンプル コードの後続の IKsTopologyInfo::CreateNodeInstance メソッドの呼び出しで使用されます。