Поделиться через


Пример приложения для единиц расширения UVC

Важно!

Содержимое и пример кода в этом разделе устарели и в настоящее время не поддерживаются. Он может не работать с текущей цепочкой инструментов разработки драйверов.

В этом разделе содержится пример кода приложения, который можно использовать для поддержки единиц расширения.

Приложение обращается к интерфейсу с помощью IKsTopologyInfo::CreateNodeInstance , а затем вызывает QueryInterface в объекте node, чтобы получить необходимый API COM. Дополнительные сведения см. в разделе IKsTopologyInfo.

Включите следующий код в источник приложения с произвольным именем TestApp.cpp.

Кроме того, включите в TestApp.cpp код, показанный в разделе Поддержка событий автоматического обновления с помощью единиц расширения.

  // 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 , чтобы найти необходимый узел единицы расширения и вернуть его идентификатор в dwExtensionNode. Этот идентификатор используется в последующем вызове метода IKsTopologyInfo::CreateNodeInstance этого примера кода.