Konfigurieren des Proxylocators

Die Anwendung kann die Standardkonfiguration des Proxylocators ändern, indem die MFNETSOURCE_PROXYLOCATORFACTORY-Eigenschaft auf das Proxylocator-Factoryobjekt festgelegt wird, das von der Anwendung implementiert wird. Wenn die Anwendung Quelllösermethoden aufruft, um die Netzwerkquelle zu erstellen, ruft Media Foundation die Proxylocatorfactory auf. Dieses Objekt erstellt den Proxylocator mit benutzerdefinierter Konfiguration.

So ändern Sie die Standardkonfigurationseinstellung des Proxylocators

  1. Implementieren Sie die IMFNetProxyLocatorFactory-Schnittstelle .
  2. Führen Sie in der IMFNetProxyLocatorFactory::CreateProxyLocator-Methode die folgenden Schritte aus:
    1. Erstellen Sie einen Eigenschaftenspeicher.
    2. Legen Sie die Konfigurationseinstellungen für den Proxylocator fest. Informationen zu diesen Einstellungen finden Sie unter Proxylocator-Konfigurationseinstellungen.
    3. Rufen Sie die MFCreateProxyLocator-Funktion auf . Übergeben Sie den Eigenschaftenspeicher und das Protokoll. Das Protokoll wird im pszProtocol-Parameter von CreateProxyLocator angegeben.
  3. Erstellen Sie eine instance Ihrer Proxylocator-Factoryklasse, und rufen Sie einen Zeiger auf die zugehörige IMFNetProxyLocatorFactory-Schnittstelle ab.
  4. Erstellen Sie einen weiteren Eigenschaftenspeicher, und legen Sie den Wert der MFNETSOURCE_PROXYLOCATORFACTORY Eigenschaft gleich dem IMFNetProxyLocatorFactory-Zeiger aus Schritt 3 fest.
  5. Übergeben Sie beim Erstellen der Netzwerkquelle den Eigenschaftenspeicher im pProps-Parameter der Quellresolvermethoden wie IMFSourceResolver::BeginCreateObjectFromURL.

Beispiel

Im folgenden Codebeispiel wird die IMFNetProxyLocatorFactory-Schnittstelle implementiert. Die IMFNetProxyLocatorFactory::CreateProxyLocator-Methode erstellt eine instance des Standardproxylocators und konfiguriert ihn für den Betrieb im Modus für die automatische Erkennung.

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

Das nächste Beispiel zeigt, wie der IMFNetProxyLocatorFactory-Zeiger an die Netzwerkquelle übergeben wird.

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

Proxyunterstützung für Netzwerkquellen