Erstellen von Filterdiagrammen in DRM-Enabled Anwendungen
Wenn Ihre DirectShow-Anwendung die Wiedergabe von DRM-geschützten Dateien unterstützt, sollten Sie im Allgemeinen renderFile nicht zum Erstellen des Filterdiagramms verwenden, da es keine Möglichkeit gibt, anzugeben, welche DRM-Rechte Sie vor dem Öffnen der Datei anfordern. Der WM ASF-Reader fordert standardmäßig nur Wiedergaberechte an. Der Filter wird dem Diagramm nicht hinzugefügt und kann daher erst von Anwendungen gefunden werden, wenn eine Datei erfolgreich geöffnet wurde.
Um ein DRM-fähiges Wiedergabediagramm mithilfe des WM ASF-Readerszu erstellen, müssen Sie den Filter mit CoCreateInstance instanziieren, ihn mithilfe von IGraphBuilder::AddFilter dem Filterdiagramm hinzufügen, ihn konfigurieren und dann seine Ausgabepins rendern. Diese Technik wird im PlayWndASF-Beispiel demonstriert. Wenn Sie das Diagramm auf diese Weise erstellen, verfügen Sie bereits über den IBaseFilter-Zeiger, mit dem QueryService aufgerufen werden kann, um IWMDRMWriter zu erhalten. Diese Schnittstelle ist jedoch erst verfügbar, wenn das Windows Media Format SDK-Readerobjekt intern vom WM ASF-Reader erstellt wurde. Die erste Gelegenheit, die die Anwendung zum Festlegen von DRM-Rechten hat, befindet sich im WMT _ NO _ RIGHTS EX-Ereignishandler, wie im folgenden _ Codeausschnitt gezeigt:
case WMT_NO_RIGHTS_EX:
IServiceProvider *pServiceProvider;
IWMDRMReader pWMDRMReader;
JIF(g_pReader->QueryInterface(IID_IServiceProvider, (void **) &pServiceProvider));
JIF(pServiceProvider->QueryService(IID_IWMDRMReader, IID_IWMDRMReader, (void **) &pWMDRMReader));
SAFE_RELEASE(pServiceProvider);
// Set the rights we want for this file. These are the actions we
// might want to perform on the file. Here we ask for two rights only.
// In a real application you should enable users to select which
// rights they want.
hr = pWMDRMReader->SetDRMProperty(g_wszWMDRM_Rights, WMT_TYPE_STRING,
BYTE*) wszRights, (sizeof(wszRights) / sizeof(wszRights[0])) * 2);
SAFE_RELEASE(pWMDRMReader);
if (FAILED(hr))
{
Msg(TEXT("SetDRMProperty Failed! hr=0x%x\n"), hr);
return hr;
}
// Now proceed with license acqusition.
if( pEventData->pData )
{
hr = HandleNoRightsEx(pEventData->hrStatus,
(WM_GET_LICENSE_DATA *)pEventData->pData);
}
else
{
hr = E_FAIL;
}
break;