Aplicativo de exemplo para unidades de extensão UVC

Importante

O conteúdo e o código de exemplo neste tópico estão desatualizados e atualmente sem suporte. Ele pode não funcionar com a cadeia de ferramentas de desenvolvimento de driver atual.

Este tópico contém o código de aplicativo de exemplo que você pode usar para dar suporte a Unidades de Extensão.

Um aplicativo acessa a interface usando IKsTopologyInfo::CreateNodeInstance seguido de uma chamada para QueryInterface no objeto de nó para obter a API COM necessária. Para obter mais informações, consulte IKsTopologyInfo.

Inclua o código a seguir na origem do aplicativo, chamada arbitrariamente de TestApp.cpp.

Inclua também em TestApp.cpp o código mostrado em Suporte a eventos de autenticação automática com unidades de extensão.

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

Nesse caso, pUnkOuter deve ser um ponteiro para o filtro de captura que representa o dispositivo UVC (Classe de Vídeo USB). Depois de adicionar o filtro de captura ao grafo de filtro, você pode consultar o filtro para a interface IKsTopologyInfo , conforme mostrado neste código de exemplo.

Escreva o código para a função FindExtensionNode para localizar o nó de unidade de extensão necessário e retornar sua ID em dwExtensionNode. Essa ID é usada na chamada subsequente deste código de exemplo para o método IKsTopologyInfo::CreateNodeInstance .