UVC 扩展单元的示例应用程序

重要

本主题中的内容和示例代码已过时,目前不受支持。 它可能不适用于当前驱动程序开发工具链。

本主题包含可用于支持扩展单元的示例应用程序代码。

应用程序使用 IKsTopologyInfo::CreateNodeInstance 访问接口,然后调用 node 对象上的 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 方法的后续调用。