Partager via


Exemple d’application pour les unités d’extension UVC

Important

Le contenu et l’exemple de code de cette rubrique sont obsolètes et actuellement non pris en charge. Il se peut que cela ne fonctionne pas avec la chaîne d’outils de développement de pilotes actuelle.

Cette rubrique contient un exemple de code d’application que vous pouvez utiliser pour prendre en charge les unités d’extension.

Une application accède à l’interface à l’aide d’IKsTopologyInfo::CreateNodeInstance suivi d’un appel à QueryInterface sur l’objet node pour obtenir l’API COM requise. Pour plus d’informations, consultez IKsTopologyInfo.

Incluez le code suivant dans la source de l’application, nommé arbitrairement TestApp.cpp.

Incluez également dans TestApp.cpp le code indiqué dans Prise en charge des événements de mise à jour automatique avec des unités d’extension.

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

Dans ce cas, pUnkOuter doit être un pointeur vers le filtre de capture qui représente l’appareil DE classe vidéo USB (UVC). Après avoir ajouté le filtre de capture au graphe de filtre, vous pouvez interroger le filtre pour l’interface IKsTopologyInfo , comme indiqué dans cet exemple de code.

Écrivez le code de la fonction FindExtensionNode afin de localiser le nœud d’unité d’extension nécessaire et de retourner son ID dans dwExtensionNode. Cet ID est utilisé dans l’appel suivant de cet exemple de code à la méthode IKsTopologyInfo::CreateNodeInstance .