다음을 통해 공유


프록시 로케이터를 구성하는 방법

애플리케이션은 MFNETSOURCE_PROXYLOCATORFACTORY 속성을 애플리케이션에서 구현하는 프록시 로케이터 팩터리 개체로 설정하여 프록시 로케이터의 기본 구성을 변경할 수 있습니다. 애플리케이션이 원본 확인자 메서드를 호출하여 네트워크 원본을 만들 때 Media Foundation은 프록시 로케이터 팩터리를 호출합니다. 이 개체는 사용자 지정 구성을 사용하여 프록시 로케이터를 만듭니다.

프록시 로케이터의 기본 구성 설정을 변경하려면

  1. IMFNetProxyLocatorFactory 인터페이스를 구현합니다.
  2. IMFNetProxyLocatorFactory::CreateProxyLocator 메서드에서 다음을 수행합니다.
    1. 속성 저장소를 만듭니다.
    2. 프록시 로케이터에 대한 구성 설정을 지정합니다. 이러한 설정에 대한 자세한 내용은 프록시 로케이터 구성 설정을 참조하세요.
    3. MFCreateProxyLocator 함수를 호출합니다. 속성 저장소 및 프로토콜을 전달합니다. 프로토콜은 CreateProxyLocatorpszProtocol 매개 변수에 지정됩니다.
  3. 프록시 로케이터 팩터리 클래스의 instance 만들고 해당 IMFNetProxyLocatorFactory 인터페이스에 대한 포인터를 가져옵니다.
  4. 다른 속성 저장소를 만들고 3단계에서 IMFNetProxyLocatorFactory 포인터와 같은 MFNETSOURCE_PROXYLOCATORFACTORY 속성 값을 설정합니다.
  5. 네트워크 원본을 만들 때 IMFSourceResolver::BeginCreateObjectFromURL과 같은 원본 확인자 메서드의 pProps 매개 변수에 속성 저장소를 전달합니다.

예제

다음 코드 예제에서는 IMFNetProxyLocatorFactory 인터페이스를 구현합니다. IMFNetProxyLocatorFactory::CreateProxyLocator 메서드는 기본 프록시 로케이터의 instance 만들고 자동 검색 모드에서 작동하도록 구성합니다.

class CProxyLocatorFactory : public IMFNetProxyLocatorFactory 
{
    LONG m_cRef;

public:

    CProxyLocatorFactory() : m_cRef(1)
    {
    }

    STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
    {
        static const QITAB qit[] = 
        {
            QITABENT(CProxyLocatorFactory, IMFNetProxyLocatorFactory),
            { 0 }
        };
        return QISearch(this, qit, riid, ppv);
    }

    STDMETHODIMP_(ULONG) AddRef()
    {
        return InterlockedIncrement(&m_cRef);
    }

    STDMETHODIMP_(ULONG) Release()
    {
        LONG cRef = InterlockedDecrement(&m_cRef);
        if (cRef == 0)
        {
            delete this;
        }
        return cRef;
    }

    STDMETHODIMP CreateProxyLocator(
        LPCWSTR pszProtocol, 
        IMFNetProxyLocator **ppProxyLocator
        )
    {
        *ppProxyLocator = NULL;

        //Create the property store object
        IPropertyStore *pProp = NULL;

        HRESULT hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pProp));

        if(SUCCEEDED(hr))
        {
            // Property key for proxy settings.
            PROPERTYKEY key;
            key.fmtid = MFNETSOURCE_PROXYSETTINGS;        
            key.pid = 0;

            // Proxy settings
            PROPVARIANT var;
            var.vt = VT_I4;
            var.lVal = MFNET_PROXYSETTING_AUTO;

            hr = pProp->SetValue(key, var);
        }

        //Create the default proxy locator.

        if(SUCCEEDED(hr))
        {
            hr = MFCreateProxyLocator(pszProtocol, pProp, ppProxyLocator);
        }

        SafeRelease(&pProp);
        return hr;
    }
};

다음 예제에서는 IMFNetProxyLocatorFactory 포인터를 네트워크 원본에 전달하는 방법을 보여 줍니다.

// Creates a media source from a URL.
//
// This example demonstrates how to set a proxy locator on the network source.

HRESULT CreateMediaSourceWithProxyLocator(
    PCWSTR pszURL, 
    IMFMediaSource **ppSource
    )
{
    IPropertyStore *pConfig = NULL;

    IMFNetProxyLocatorFactory *pFactory = new (std::nothrow) CProxyLocatorFactory();

    if (pFactory == NULL)
    {
        return E_OUTOFMEMORY;
    }

    // Configure the property store.
    HRESULT hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pConfig));

    if (SUCCEEDED(hr))
    {
        PROPERTYKEY key;
        key.fmtid =  MFNETSOURCE_PROXYLOCATORFACTORY;
        key.pid = 0;

        PROPVARIANT var;
        var.vt = VT_UNKNOWN;
        var.punkVal = pFactory;

        hr = pConfig->SetValue(key, var);
    }

    // Create the source media source.
    if (SUCCEEDED(hr))
    {
        hr = CreateMediaSource(pszURL, pConfig, ppSource);
    }

    SafeRelease(&pConfig);
    return hr;
}

네트워크 원본에 대한 프록시 지원