1단계. 속성을 설정하기 위한 메커니즘 정의
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
필터는 속성 페이지가 필터에서 속성을 설정하고 검색할 수 있도록 속성 페이지와 통신하는 방법을 지원해야 합니다. 가능한 메커니즘에는 다음이 포함됩니다.
- 사용자 지정 COM 인터페이스를 노출합니다.
- IDispatch를 통해 Automation 속성을 지원합니다.
- IPropertyBag 인터페이스를 노출하고 명명된 속성 집합을 정의합니다.
이 예제에서는 ISaturation이라는 사용자 지정 COM 인터페이스를 사용합니다. 실제 DirectShow 인터페이스가 아닙니다. 이 예제에 대해서만 정의됩니다. 먼저 IID(인터페이스 식별자)와 함께 헤더 파일에서 인터페이스를 선언합니다.
// Always create new GUIDs! Never copy a GUID from an example.
DEFINE_GUID(IID_ISaturation, 0x19412d6e, 0x6401,
0x475c, 0xb0, 0x48, 0x7a, 0xd2, 0x96, 0xe1, 0x6a, 0x19);
interface ISaturation : public IUnknown
{
STDMETHOD(GetSaturation)(long *plSat) = 0;
STDMETHOD(SetSaturation)(long lSat) = 0;
};
IDL을 사용하여 인터페이스를 정의하고 MIDL 컴파일러를 사용하여 헤더 파일을 만들 수도 있습니다. 다음으로, 필터에서 사용자 지정 인터페이스를 구현합니다. 이 예제에서는 필터의 채도 값에 대해 "Get" 및 "Set" 메서드를 사용합니다. 두 메서드 모두 m_lSaturation 멤버를 중요한 섹션으로 보호합니다.
class CGrayFilter : public ISaturation, /* Other inherited classes. */
{
private:
CCritSec m_csShared; // Protects shared data.
long m_lSaturation; // Saturation level.
public:
STDMETHODIMP GetSaturation(long *plSat)
{
if (!plSat) return E_POINTER;
CAutoLock lock(&m_csShared);
*plSat = m_lSaturation;
return S_OK;
}
STDMETHODIMP SetSaturation(long lSat)
{
CAutoLock lock(&m_csShared);
if (lSat < SATURATION_MIN || lSat > SATURATION_MAX)
{
return E_INVALIDARG;
}
m_lSaturation = lSat;
return S_OK;
}
};
물론 사용자 고유의 구현에 대한 세부 정보는 여기에 표시된 예제와 다릅니다.
다음: 2단계. ISpecifyPropertyPages를 구현합니다.
관련 항목