Compartir a través de


Aplicación de ejemplo para unidades de extensión UVC

Importante

El contenido y el código de ejemplo de este tema están obsoletos y no se admiten actualmente. Es posible que no funcione con la cadena de herramientas de desarrollo de controladores actual.

Este tema contiene código de aplicación de ejemplo que puede usar para admitir unidades de extensión.

Una aplicación accede a la interfaz mediante IKsTopologyInfo::CreateNodeInstance seguida de una llamada a QueryInterface en el objeto de nodo para obtener la API COM necesaria. Para obtener más información, vea IKsTopologyInfo.

Incluya el código siguiente en el origen de la aplicación, denominado arbitrariamente TestApp.cpp.

Incluya también en TestApp.cpp el código que se muestra en Compatibilidad con eventos de actualización automática con unidades de extensión.

  // 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));

En este caso, pUnkOuter debe ser un puntero al filtro de captura que representa el dispositivo de clase de vídeo USB (UVC). Después de agregar el filtro de captura al gráfico de filtros, puede consultar el filtro de la interfaz IKsTopologyInfo , como se muestra en este código de ejemplo.

Escriba el código de la función FindExtensionNode para buscar el nodo de unidad de extensión necesario y devolver su identificador en dwExtensionNode. Este identificador se usa en la llamada posterior de este código de ejemplo al método IKsTopologyInfo::CreateNodeInstance .