프록시 로케이터를 구성하는 방법
애플리케이션은 MFNETSOURCE_PROXYLOCATORFACTORY 속성을 애플리케이션에서 구현하는 프록시 로케이터 팩터리 개체로 설정하여 프록시 로케이터의 기본 구성을 변경할 수 있습니다. 애플리케이션이 원본 확인자 메서드를 호출하여 네트워크 원본을 만들 때 Media Foundation은 프록시 로케이터 팩터리를 호출합니다. 이 개체는 사용자 지정 구성을 사용하여 프록시 로케이터를 만듭니다.
프록시 로케이터의 기본 구성 설정을 변경하려면
- IMFNetProxyLocatorFactory 인터페이스를 구현합니다.
-
IMFNetProxyLocatorFactory::CreateProxyLocator 메서드에서 다음을 수행합니다.
- 속성 저장소를 만듭니다.
- 프록시 로케이터에 대한 구성 설정을 지정합니다. 이러한 설정에 대한 자세한 내용은 프록시 로케이터 구성 설정을 참조하세요.
- MFCreateProxyLocator 함수를 호출합니다. 속성 저장소 및 프로토콜을 전달합니다. 프로토콜은 CreateProxyLocator의 pszProtocol 매개 변수에 지정됩니다.
- 프록시 로케이터 팩터리 클래스의 instance 만들고 해당 IMFNetProxyLocatorFactory 인터페이스에 대한 포인터를 가져옵니다.
- 다른 속성 저장소를 만들고 3단계에서 IMFNetProxyLocatorFactory 포인터와 같은 MFNETSOURCE_PROXYLOCATORFACTORY 속성 값을 설정합니다.
- 네트워크 원본을 만들 때 IMFSourceResolver::BeginCreateObjectFromURL과 같은 원본 확인자 메서드의 pProps 매개 변수에 속성 저장소를 전달합니다.
예제
다음 코드 예제에서는 IMFNetProxyLocatorFactory 인터페이스를 구현합니다. IMFNetProxyLocatorFactory::CreateProxyLocator 메서드는 기본 프록시 로케이터의 instance 만들고 자동 검색 모드에서 작동하도록 구성합니다.
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;
}
관련 항목