UVC 확장 단위에 대한 샘플 애플리케이션
중요
이 항목의 콘텐츠 및 샘플 코드는 오래되었으며 현재 지원되지 않습니다. 현재 드라이버 개발 도구 체인에서는 작동하지 않을 수 있습니다.
이 항목에는 확장 단위를 지원하는 데 사용할 수 있는 샘플 애플리케이션 코드가 포함되어 있습니다.
애플리케이션은 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에서 해당 ID를 반환합니다. 이 ID는 IKsTopologyInfo::CreateNodeInstance 메서드에 대한 이 샘플 코드의 후속 호출에 사용됩니다.