[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
IUnknown의 메서드를 사용하면 애플리케이션이 구성 요소의 인터페이스를 쿼리하고 구성 요소의 참조 수를 관리할 수 있습니다.
참조 개수
참조 수는 AddRef 메서드에서 증가되고 Release 메서드에서 감소되는 내부 변수입니다. 기본 클래스는 참조 수를 관리하고 여러 스레드 간에 참조 수에 대한 액세스를 동기화합니다.
인터페이스 쿼리
인터페이스에 대한 쿼리도 간단합니다. 호출자는 두 개의 매개 변수인 IID(인터페이스 식별자)와 포인터 주소를 전달합니다. 구성 요소가 요청된 인터페이스를 지원하는 경우 인터페이스에 대한 포인터를 설정하고, 자체 참조 수를 증가시키고, S_OK 반환합니다. 그렇지 않으면 포인터를 NULL 로 설정하고 E_NOINTERFACE 반환합니다. 다음 의사 코드는 QueryInterface 메서드의 일반적인 개요를 보여 줍니다. 다음 섹션에서 설명하는 구성 요소 집계는 몇 가지 추가 복잡성을 도입합니다.
if (IID == IID_IUnknown)
set pointer to (IUnknown *)this
AddRef
return S_OK
else if (IID == IID_ISomeInterface)
set pointer to (ISomeInterface *)this
AddRef
return S_OK
else if ...
else
set pointer to NULL
return E_NOINTERFACE
한 구성 요소의 QueryInterface 메서드와 다른 구성 요소의 QueryInterface 메서드 간의 유일한 차이점은 각 구성 요소가 테스트하는 IID 목록입니다. 구성 요소가 지원하는 모든 인터페이스에 대해 구성 요소는 해당 인터페이스의 IID를 테스트해야 합니다.
집계 및 위임
구성 요소 집계는 호출자에게 투명해야 합니다. 따라서 집계는 집계된 구성 요소가 외부 구성 요소의 구현으로 지연되는 단일 IUnknown 인터페이스를 노출해야 합니다. 그렇지 않으면 호출자에게 동일한 집계에 두 개의 서로 다른 IUnknown 인터페이스가 표시됩니다. 구성 요소가 집계되지 않은 경우 자체 구현을 사용합니다.
이 동작을 지원하려면 구성 요소가 간접 참조 수준을 추가해야 합니다. 위임된 IUnknown은 작업을 적절한 위치(외부 구성 요소, 있는 경우 또는 구성 요소의 내부 버전)에 위임합니다. 이전 섹션에서 설명 한 대로 승인되지 않은 IUnknown 은 작업을 수행합니다.
위임 버전은 공용이며 IUnknown이라는 이름을 유지합니다. 승인되지 않은 버전의 이름이 INonDelegatingUnknown으로 변경되었습니다. 이 이름은 공용 인터페이스가 아니므로 COM 사양의 일부가 아닙니다.
클라이언트는 구성 요소의 instance 만들 때 IClassFactory::CreateInstance 메서드를 호출합니다. 하나의 매개 변수는 집계 구성 요소의 IUnknown 인터페이스에 대한 포인터이거나 새 instance 집계되지 않은 경우 NULL입니다. 구성 요소는 다음 예제와 같이 이 매개 변수를 사용하여 사용할 IUnknown 인터페이스를 나타내는 멤버 변수를 저장합니다.
CMyComponent::CMyComponent(IUnknown *pOuterUnkown)
{
if (pOuterUnknown == NULL)
m_pUnknown = (IUnknown *)(INonDelegatingUnknown *)this;
else
m_pUnknown = pOuterUnknown;
[ ... more constructor code ... ]
}
위임 IUnknown 의 각 메서드는 다음 예제와 같이 위임되지 않은 해당 메서드를 호출합니다.
HRESULT QueryInterface(REFIID iid, void **ppv)
{
return m_pUnknown->QueryInterface(iid, ppv);
}
위임의 특성에 따라 위임 메서드는 모든 구성 요소에서 동일하게 보입니다. 위임되지 않은 버전만 변경됩니다.
관련 항목