Dela via


Hur man konfigurerar proxylokaliseraren

Programmet kan ändra standardkonfigurationen för proxylokaliseraren genom att ange egenskapen MFNETSOURCE_PROXYLOCATORFACTORY till proxylokaliserarfabriksobjektet som implementeras av programmet. När programmet anropar källlösarmetoder för att skapa nätverkskällan anropar Media Foundation proxylokaliserarfabriken. Det här objektet skapar proxylokaliseraren med anpassad konfiguration.

Ändra standardkonfigurationsinställningen för proxylokaliseraren

  1. Implementera gränssnittet IMFNetProxyLocatorFactory.
  2. Gör följande i metoden IMFNetProxyLocatorFactory::CreateProxyLocator:
    1. Skapa en egenskapsbutik.
    2. Ange konfigurationsinställningarna för proxylokaliseraren. Information om de här inställningarna finns i Konfigurationsinställningar för proxylokaliserare.
    3. Anropa funktionen MFCreateProxyLocator. Skicka in egenskapsarkivet och protokollet. Protokollet anges i parametern pszProtocol för CreateProxyLocator.
  3. Skapa en instans av din proxylokalisatorfabriksklass och få en pekare till dess IMFNetProxyLocatorFactory-gränssnitt.
  4. Skapa ett annat egenskapslager och ange värdet för egenskapen MFNETSOURCE_PROXYLOCATORFACTORY lika med IMFNetProxyLocatorFactory pekare från steg 3.
  5. När du skapar nätverkskällan skickar du egenskapsarkivet i parametern pProps för källlösningsmetoderna, till exempel IMFSourceResolver::BeginCreateObjectFromURL.

Exempel

I följande kodexempel implementeras gränssnittet IMFNetProxyLocatorFactory. Metoden IMFNetProxyLocatorFactory::CreateProxyLocator skapar en instans av standardproxylokaliseraren och konfigurerar den för automatisk identifiering.

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

Nästa exempel visar hur du skickar IMFNetProxyLocatorFactory pekare till nätverkskällan.

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

proxystöd för nätverkskällor