Разблокировка пакета SDK для формата Windows Media
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
Чтобы получить доступ к версии 7 или 7.1 пакета SDK для формата Windows Media, приложение должно предоставить сертификат программного обеспечения, также называемый ключом, во время выполнения. Этот ключ содержится в статической библиотеке с именем wmstub.lib, с которой приложение связывается во время сборки. Отдельный ключ требуется только для создания или чтения файлов, защищенных DRM. Файлы, не относящиеся к DRM, можно создавать с помощью статической библиотеки, предоставляемой вместе с пакетом SDK для формата Windows Media. Дополнительные сведения о получении ключа DRM см. в разделе Windows Media Format SDK. Приложение DirectShow предоставляет свой сертификат средству записи WM ASF при его добавлении в граф фильтров. Приложение должно быть зарегистрировано в качестве поставщика ключей с помощью интерфейсов COM IServiceProvider и IObjectWithSite . Используя этот метод, приложение реализует класс поставщика ключей, производный от IServiceProvider. Этот класс реализует три стандартных метода COM — AddRef, QueryInterface и Release, а также один дополнительный метод QueryService, который вызывается диспетчером графов фильтров. QueryService вызывает метод пакета SDK для формата Windows Media WMCreateCertificate и возвращает диспетчеру графа фильтров указатель на созданный сертификат. Если сертификат действителен, диспетчер графов фильтров позволяет продолжить процесс построения графа.
Примечание
Чтобы создать приложение, добавьте Wmsdkidl.h в прототип для WMCreateCertificate и создайте ссылку на библиотеку Wmstub.lib.
В следующем примере кода показаны основные шаги в этом процессе:
// Declare and implement a key provider class derived from IServiceProvider.
class CKeyProvider : public IServiceProvider {
public:
// IUnknown interface
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
CKeyProvider();
// IServiceProvider
STDMETHODIMP QueryService(REFIID siid, REFIID riid, void **ppv);
private:
ULONG m_cRef;
};
CKeyProvider::CKeyProvider() : m_cRef(0)
{
}
// IUnknown methods
ULONG CKeyProvider::AddRef()
{
return InterlockedIncrement(&m_cRef);
}
ULONG CKeyProvider::Release()
{
ASSERT(m_cRef > 0);
ULONG lCount = InterlockedDecrement(&m_cRef);
if (m_cRef == 0)
{
delete this;
return (ULONG)0;
}
return (ULONG)lCount;
}
// We only support IUnknown and IServiceProvider.
HRESULT CKeyProvider::QueryInterface(REFIID riid, void ** ppv)
{
if (!ppv) return E_POINTER;
if (riid == IID_IUnknown)
{
*ppv = (void *) static_cast<IUnknown *>(this);
AddRef();
return S_OK;
}
if (riid == IID_IServiceProvider)
{
*ppv = (void *) static_cast<IServiceProvider *>(this);
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP CKeyProvider::QueryService(REFIID siid, REFIID riid, void **ppv)
{
if (!ppv) return E_POINTER;
if (siid == __uuidof(IWMReader) && riid == IID_IUnknown)
{
IUnknown *punkCert;
HRESULT hr = WMCreateCertificate(&punkCert);
if (SUCCEEDED(hr))
{
*ppv = (void *) punkCert;
}
return hr;
}
return E_NOINTERFACE;
}
////////////////////////////////////////////////////////////////////
//
// These examples illustrate the sequence of method calls
// in your application. Error checking is omitted for brevity.
//
///////////////////////////////////////////////////////////////////
// Create the filter graph manager, but don't add any filters.
IGraphBuilder *pGraph;
hr = CreateFilterGraph(&pGraph);
...
// Instantiate the key provider class, and AddRef it
// so that COM doesn't try to free our static object.
CKeyProvider prov;
prov.AddRef(); // Don't let COM try to free our static object.
// Give the graph an IObjectWithSite pointer for callbacks and QueryService.
IObjectWithSite* pObjectWithSite = NULL;
hr = pGraph->QueryInterface(IID_IObjectWithSite, (void**)&pObjectWithSite);
if (SUCCEEDED(hr))
{
// Use the IObjectWithSite pointer to specify our key provider object.
// The filter graph manager will use this pointer to call
// QueryService to do the unlocking.
// If the unlocking succeeds, then we can build our graph.
pObjectWithSite->SetSite((IUnknown *) (IServiceProvider *) &prov);
pObjectWithSite->Release();
}
// Now build the graph.
Связанные темы