重要
本主题中的内容和示例代码已过时,当前不受支持。 它可能不适用于当前的驱动程序开发工具链。
本主题包含可用于支持扩展单元的示例应用程序代码。
应用程序使用 IKsTopologyInfo::CreateNodeInstance 访问接口,然后调用节点对象上的 QueryInterface 以获取所需的 COM API。 有关详细信息,请参阅 IKsTopologyInfo。
在应用程序源中包含以下代码,任意命名TestApp.cpp。
还需在TestApp.cpp中包括支持扩展单元自动更新事件中显示的代码。
// 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 函数的代码以查找必要的扩展单元节点并在 dwExtensionNode 中返回其 ID。 此示例代码后续调用 IKsTopologyInfo::CreateNodeInstance 方法时使用此 ID。