设置凭据管理器
向网络源提供凭据的应用程序必须执行以下操作:
- 实现公开 IMFNetCredentialManager 接口的凭据管理器对象。
- 在创建网络源之前,请创建新的属性存储。
- 在属性存储中设置 MFNETSOURCE_CREDENTIAL_MANAGER 属性。 属性的值是指向 IMFNetCredentialManager 接口的指针。
- 将指向属性存储的指针传递给源解析程序,如 配置媒体源中所述。
网络源使用凭据管理器获取用户凭据。 如果网络源需要凭据才能访问网络资源,它将调用应用程序的 IMFNetCredentialManager::BeginGetCredentials 方法。 此调用将启动异步请求来获取用户的凭据。 BeginGetCredentials 方法可以从凭据缓存或用户获取凭据。 凭据存储在 凭据对象中。 操作完成后,应用程序会调用回调接口来通知网络源。 网络源调用 IMFNetCredentialManager::EndGetCredentials 来完成异步操作。
由于这是一个异步操作,因此应用程序必须在操作结束时调度回调。 有关编写异步方法的分步说明,请参阅 编写异步方法。
以下示例演示如何在网络源上设置 MFNETSOURCE_CREDENTIAL_MANAGER 属性。
// Creates a media source from a URL.
//
// Demonstrates how to set a credential manager on the network source.
HRESULT CreateMediaSourceWithCredentialManager(
PCWSTR pszURL,
IMFMediaSource **ppSource
)
{
IPropertyStore *pConfig = NULL;
CCredentialManager *pCredentials = new (std::nothrow) CCredentialManager();
if (pCredentials == NULL)
{
return E_OUTOFMEMORY;
}
// Configure the property store.
HRESULT hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pConfig));
if (SUCCEEDED(hr))
{
PROPERTYKEY key;
key.fmtid = MFNETSOURCE_CREDENTIAL_MANAGER;
key.pid = 0;
PROPVARIANT var;
var.vt = VT_UNKNOWN;
pCredentials->QueryInterface(IID_PPV_ARGS(&var.punkVal));
hr = pConfig->SetValue(key, var);
PropVariantClear(&var);
}
// Create the source media source.
if (SUCCEEDED(hr))
{
hr = CreateMediaSource(pszURL, pConfig, ppSource);
}
SafeRelease(&pConfig);
SafeRelease(&pCredentials);
return hr;
}
相关主题