Compartir a través de


Configuración del localizador de proxy

La aplicación puede cambiar la configuración predeterminada del localizador de proxy estableciendo la propiedad MFNETSOURCE_PROXYLOCATORFACTORY en el objeto de generador de localizadores de proxy implementado por la aplicación. Cuando la aplicación llama a los métodos de resolución de origen para crear el origen de red, Media Foundation llama al generador de localizadores de proxy. Este objeto crea el localizador de proxy con configuración personalizada.

Para cambiar la configuración predeterminada del localizador de proxy

  1. Implemente la interfaz IMFNetProxyLocatorFactory .
  2. En el método IMFNetProxyLocatorFactory::CreateProxyLocator , haga lo siguiente:
    1. Cree un almacén de propiedades.
    2. Establezca los valores de configuración para el localizador de proxy. Para obtener información sobre estas opciones, consulte Configuración de localizador de proxy.
    3. Llame a la función MFCreateProxyLocator . Pase el almacén de propiedades y el protocolo. El protocolo se especifica en el parámetro pszProtocol de CreateProxyLocator.
  3. Cree una instancia de la clase de generador de localizadores de proxy y obtenga un puntero a su interfaz IMFNetProxyLocatorFactory .
  4. Cree otro almacén de propiedades y establezca el valor de la propiedad MFNETSOURCE_PROXYLOCATORFACTORY igual al puntero IMFNetProxyLocatorFactory del paso 3.
  5. Al crear el origen de red, pase el almacén de propiedades en el parámetro pProps de los métodos de resolución de origen, como IMFSourceResolver::BeginCreateObjectFromURL.

Ejemplo

En el ejemplo de código siguiente se implementa la interfaz IMFNetProxyLocatorFactory . El método IMFNetProxyLocatorFactory::CreateProxyLocator crea una instancia del localizador de proxy predeterminado y lo configura para que funcione en modo de detección automática.

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

En el ejemplo siguiente se muestra cómo pasar el puntero IMFNetProxyLocatorFactory al origen de red.

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

Compatibilidad con proxy para orígenes de red