Entsperren des Windows Media Format SDK
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
Für den Zugriff auf Version 7 oder 7.1 des Windows Media Format SDK muss eine Anwendung zur Laufzeit ein Softwarezertifikat bereitstellen, das auch als Schlüssel bezeichnet wird. Dieser Schlüssel ist in einer statischen Bibliothek namens wmstub.lib enthalten, mit der die Anwendung zur Buildzeit verknüpft ist. Ein individualisierter Schlüssel ist nur zum Erstellen oder Lesen von DRM-geschützten Dateien erforderlich. Nicht-DRM-Dateien können mithilfe der statischen Bibliothek erstellt werden, die mit dem Windows Media Format SDK bereitgestellt wird. Ausführliche Informationen zum Abrufen des DRM-Schlüssels finden Sie im Windows Media Format SDK. Eine DirectShow-Anwendung stellt ihr Zertifikat dem WM ASF Writer bereit, wenn es dem Filterdiagramm hinzugefügt wird. Die Anwendung muss sich über die COM IServiceProvider - und IObjectWithSite-Schnittstellen als Schlüsselanbieter registrieren. Mit diesem Verfahren implementiert die Anwendung eine von IServiceProvider abgeleitete Schlüsselanbieterklasse. Diese Klasse implementiert die drei COM-Standardmethoden – AddRef, QueryInterface und Release – zusammen mit einer zusätzlichen Methode, QueryService, die vom Filtergraph-Manager aufgerufen wird. QueryService ruft die Windows Media Format SDK-Methode WMCreateCertificate auf und gibt an den Filtergraph-Manager einen Zeiger auf das erstellte Zertifikat zurück. Wenn das Zertifikat gültig ist, ermöglicht der Filtergraph-Manager, dass der Grapherstellungsprozess fortgesetzt wird.
Hinweis
Um eine Anwendung zu erstellen, schließen Sie Wmsdkidl.h für den Prototyp für WMCreateCertificate ein, und verknüpfen Sie die Bibliothek Wmstub.lib.
Im folgenden Codebeispiel werden die grundlegenden Schritte in diesem Prozess veranschaulicht:
// 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.
Zugehörige Themen