다음을 통해 공유


1단계. 속성을 설정하기 위한 메커니즘 정의

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia 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를 구현합니다.

CCritSec 클래스

필터 속성 페이지 만들기