プロキシ ロケーターを構成する方法

アプリケーションは、アプリケーションによって実装されるプロキシ ロケーター ファクトリ オブジェクトに MFNETSOURCE_PROXYLOCATORFACTORY プロパティを設定することで、プロキシ ロケーターの既定の構成を変更できます。 アプリケーションがソース リゾルバー メソッドを呼び出してネットワーク ソースを作成すると、Media Foundation はプロキシ ロケーター ファクトリを呼び出します。 このオブジェクトは、カスタム構成を使用してプロキシ ロケーターを作成します。

プロキシ ロケーターの既定の構成設定を変更するには

  1. IMFNetProxyLocatorFactory インターフェイスを実装します。
  2. IMFNetProxyLocatorFactory::CreateProxyLocator メソッドで、次の操作を行います。
    1. プロパティ ストアを作成します。
    2. プロキシ ロケーターの構成設定を設定します。 これらの設定の詳細については、「 プロキシ ロケーターの構成設定」を参照してください。
    3. MFCreateProxyLocator 関数を呼び出します。 プロパティ ストアとプロトコルを渡します。 このプロトコルは、CreateProxyLocatorpszProtocol パラメーターで指定されます。
  3. プロキシ ロケーター ファクトリ クラスのインスタンスを作成し、その IMFNetProxyLocatorFactory インターフェイスへのポインターを取得します。
  4. 別のプロパティ ストアを作成し、手順 3 の IMFNetProxyLocatorFactory ポインターと等しいMFNETSOURCE_PROXYLOCATORFACTORY プロパティの値を設定します。
  5. ネットワーク ソースを作成するときに、IMFSourceResolver::BeginCreateObjectFromURL などのソース リゾルバー メソッドの pProps パラメーターにプロパティ ストアを渡します。

次のコード例では、 IMFNetProxyLocatorFactory インターフェイスを 実装します。 IMFNetProxyLocatorFactory::CreateProxyLocator メソッドは、既定のプロキシ ロケーターのインスタンスを作成し、自動検出モードで動作するように構成します。

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;
}

ネットワーク ソースのプロキシ サポート