如何設定 Proxy 定位器
應用程式可以將 MFNETSOURCE_PROXYLOCATORFACTORY 屬性設定為應用程式所實作的 Proxy 定位器 Factory 物件,以變更 Proxy 定位器的預設組態。 當應用程式呼叫來源解析程式方法來建立網路來源時,媒體基礎會呼叫 Proxy 定位器處理站。 此物件會建立具有自訂群組態的 Proxy 定位器。
變更 Proxy 定位器的預設組態設定
- 實作 IMFNetProxyLocatorFactory 介面。
- 在 IMFNetProxyLocatorFactory::CreateProxyLocator 方法中,執行下列動作:
- 建立屬性存放區。
- 設定 Proxy 定位器的組態設定。 如需這些設定的相關資訊,請參閱 Proxy 定位器組態設定。
- 呼叫 MFCreateProxyLocator 函式。 傳入屬性存放區和通訊協定。 通訊協定是在CreateProxyLocator的pszProtocol參數中指定。
- 建立 Proxy 定位器處理站類別的實例,並取得其 IMFNetProxyLocatorFactory 介面的指標。
- 建立另一個屬性存放區,並將 MFNETSOURCE_PROXYLOCATORFACTORY 屬性的值設定為與步驟 3 中的 IMFNetProxyLocatorFactory 指標相等。
- 當您建立網路來源時,請在來源解析程式方法的 pProps 參數中傳遞屬性存放區,例如 IMFSourceResolver::BeginCreateObjectFromURL。
範例
下列程式碼範例會實作 IMFNetProxyLocatorFactory 介面。 IMFNetProxyLocatorFactory::CreateProxyLocator方法會建立預設 Proxy 定位器的實例,並設定它以自動偵測模式運作。
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;
}
相關主題