Freigeben über


Beispielanwendung für UVC-Erweiterungseinheiten

Wichtig

Der Inhalt und der Beispielcode in diesem Thema sind veraltet und werden derzeit nicht unterstützt. Dies funktioniert möglicherweise nicht mit der aktuellen Toolkette für die Treiberentwicklung.

Dieses Thema enthält Beispielanwendungscode, den Sie zur Unterstützung von Erweiterungseinheiten verwenden können.

Eine Anwendung greift mithilfe von IKsTopologyInfo::CreateNodeInstance auf die Schnittstelle zu, gefolgt von einem Aufruf von QueryInterface für das Node-Objekt, um die erforderliche COM-API abzurufen. Weitere Informationen finden Sie unter IKsTopologyInfo.

Fügen Sie den folgenden Code in die Anwendungsquelle mit dem willkürlichen Namen TestApp.cpp ein.

Fügen Sie in TestApp.cpp auch den Code ein, der unter Unterstützen von Ereignissen für automatische Updates mit Erweiterungseinheiten angezeigt wird.

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

In diesem Fall sollte pUnkOuter ein Zeiger auf den Aufnahmefilter sein, der das UVC-Gerät (USB Video Class) darstellt. Nachdem Sie dem Filterdiagramm den Erfassungsfilter hinzugefügt haben, können Sie den Filter für die IKsTopologyInfo-Schnittstelle abfragen, wie in diesem Beispielcode gezeigt.

Schreiben Sie den Code für die FindExtensionNode-Funktion , um den erforderlichen Erweiterungseinheitsknoten zu suchen und seine ID in dwExtensionNode zurückzugeben. Diese ID wird im nachfolgenden Aufruf der IKsTopologyInfo::CreateNodeInstance-Methode dieses Beispielcodes verwendet.