Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Содержимое и пример кода в этом разделе устарели и в настоящее время не поддерживаются. Она может не работать с текущей цепочкой инструментов разработки драйверов.
В этом разделе содержится пример кода приложения, который можно использовать для поддержки единиц расширения.
Приложение обращается к интерфейсу с помощью IKsTopologyInfo::CreateNodeInstance , за которым следует вызов QueryInterface на объекте узла, чтобы получить необходимый COM-API. Дополнительные сведения см. в разделе 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 .