プロキシ ロケーターを構成する方法
アプリケーションは、アプリケーションによって実装されるプロキシ ロケーター ファクトリ オブジェクトに MFNETSOURCE_PROXYLOCATORFACTORY プロパティを設定することで、プロキシ ロケーターの既定の構成を変更できます。 アプリケーションがソース リゾルバー メソッドを呼び出してネットワーク ソースを作成すると、Media Foundation はプロキシ ロケーター ファクトリを呼び出します。 このオブジェクトは、カスタム構成を使用してプロキシ ロケーターを作成します。
プロキシ ロケーターの既定の構成設定を変更するには
- IMFNetProxyLocatorFactory インターフェイスを実装します。
-
IMFNetProxyLocatorFactory::CreateProxyLocator メソッドで、次の操作を行います。
- プロパティ ストアを作成します。
- プロキシ ロケーターの構成設定を設定します。 これらの設定の詳細については、「 プロキシ ロケーターの構成設定」を参照してください。
- MFCreateProxyLocator 関数を呼び出します。 プロパティ ストアとプロトコルを渡します。 このプロトコルは、CreateProxyLocator の pszProtocol パラメーターで指定されます。
- プロキシ ロケーター ファクトリ クラスのインスタンスを作成し、その IMFNetProxyLocatorFactory インターフェイスへのポインターを取得します。
- 別のプロパティ ストアを作成し、手順 3 の IMFNetProxyLocatorFactory ポインターと等しいMFNETSOURCE_PROXYLOCATORFACTORY プロパティの値を設定します。
- ネットワーク ソースを作成するときに、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;
}
関連トピック