Bagikan melalui


Cara Mengonfigurasi Pencari Proksi

Aplikasi dapat mengubah konfigurasi default pencari proksi dengan mengatur properti MFNETSOURCE_PROXYLOCATORFACTORY ke objek pabrik pencari proksi yang diterapkan oleh aplikasi. Ketika aplikasi memanggil metode pemecah masalah sumber untuk membuat sumber jaringan, Media Foundation memanggil pabrik pencari proksi. Objek ini membuat pencari proksi dengan konfigurasi kustom.

Untuk mengubah pengaturan konfigurasi default pencari proksi

  1. Menerapkan antarmuka IMFNetProxyLocatorFactory .
  2. Dalam metode IMFNetProxyLocatorFactory::CreateProxyLocator , lakukan hal berikut:
    1. Membuat penyimpanan properti.
    2. Atur pengaturan konfigurasi untuk pencari proksi. Untuk informasi tentang pengaturan ini, lihat Pengaturan Konfigurasi Pencari Lokasi Proksi.
    3. Panggil fungsi MFCreateProxyLocator . Teruskan di penyimpanan properti dan protokol. Protokol ditentukan dalam parameter pszProtocol dari CreateProxyLocator.
  3. Buat instans kelas pabrik pencari proksi Anda dan dapatkan penunjuk ke antarmuka IMFNetProxyLocatorFactory-nya .
  4. Buat penyimpanan properti lain dan atur nilai properti MFNETSOURCE_PROXYLOCATORFACTORY sama dengan penunjuk IMFNetProxyLocatorFactory dari langkah 3.
  5. Saat Anda membuat sumber jaringan, lewati penyimpanan properti di parameter pProps metode pemecah masalah sumber seperti IMFSourceResolver::BeginCreateObjectFromURL.

Contoh

Contoh kode berikut mengimplementasikan antarmuka IMFNetProxyLocatorFactory . Metode IMFNetProxyLocatorFactory::CreateProxyLocator membuat instans pencari proksi default, dan mengonfigurasinya untuk beroperasi dalam mode deteksi otomatis.

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

Contoh berikutnya menunjukkan cara meneruskan penunjuk IMFNetProxyLocatorFactory ke sumber jaringan.

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

Dukungan Proksi untuk Sumber Jaringan