Behandeln von Lizenzerwerbsereignissen
Eine DRM-fähige Readeranwendung verarbeitet in ihrer IWMStatusCallback::OnStatus-Rückrufmethode die folgenden vier Ereignisse im Zusammenhang mit dem Lizenzerwerbsprozess:
- WMT _ LICENSEURL _ SIGNATURE _ STATE
- WMT _ KEINE _ RECHTE
- WMT _ NO _ RIGHTS _ EX
- WMT _ ERWERBEN _ EINER LIZENZ
WMT _ LICENSEURL _ SIGNATURE _ STATE
Wenn die DRM-Komponente durch DRM Version 7 geschützte Inhalte erkennt, sucht sie zunächst nach einer gültigen Lizenz auf dem lokalen System. Wenn keines vorhanden ist, wertet sie die Lizenzerwerbs-URL im DRM-Header der Datei aus und sendet ein WMT _ LICENSEURL _ SIGNATURE _ STATE-Ereignis mit pValue, das auf einen der WMT _ DRMLA _ TRUST-Werte festgelegt ist, und gibt an, ob die URL vertrauenswürdig ist, nicht vertrauenswürdig ist oder manipuliert wurde. Wenn die URL nicht vertrauenswürdig ist, sollte die Anwendung den Benutzer warnen. Wenn die URL manipuliert wurde, sollte die Datei als beschädigt betrachtet werden, und die Anwendung sollte nicht zur URL navigieren, ohne eine starke Warnung für den Benutzer auszugeben.
WMT _ KEINE _ RECHTE
Das WMT _ NO _ RIGHTS-Ereignis wird nur für DRM-Inhalte der Version 1 gesendet. Dies bedeutet, dass die Lizenz nicht im Hintergrund erworben werden muss. Anders ausgedrückt: Der Benutzer muss zu einer Webseite navigieren, um eine Lizenz zu erhalten. Die URL für die Seite wird als breitzeichenweise auf NULL endende Zeichenfolge aus dem pValue-Parameter in der OnStatus-Methode abgerufen.
Bei Bedarf kann eine Anwendung es dem Benutzer erleichtern, zur Webseite zu navigieren, indem sie entweder Internet Explorer in einem separaten Prozess öffnet oder das Webbrowser-Steuerelement hostet. Dies ist jedoch nicht erforderlich. Zumindest könnte eine Anwendung dem Benutzer einfach die URL in einem Meldungsfeld anzeigen und ihn auffordern, ihn in die Adressleiste von Internet Explorer einzufügen. Das Audioplayer-Beispiel veranschaulicht die ordnungsgemäße Behandlung des WMT _ NO RIGHTS-Ereignisses, _ einschließlich der Formatierung der URL-Zeichenfolge und der Verwendung der CreateProcess-Methode, um Internet Explorer zu öffnen und zur angegebenen URL zu navigieren.
Da die Anwendung nicht wissen kann, wann eine DRM-Lizenz der Version 1 erworben wurde, kann der Benutzer versuchen, die Datei nach dem Erwerb der Lizenz erneut zu öffnen.
Dieser unbeaufsichtigten Lizenzerwerbsprozess kann auch für Lizenzen der Version 7 verwendet werden, aber in diesem Fall kann die Anwendung zuerst IWMDRMReader::MonitorLicenseAcquisitionaufrufen. Diese Methode bewirkt, dass der lokale Lizenzspeicher wiederholt überprüft wird, bis die Lizenz für die neue Datei gefunden wird. An diesem Punkt empfängt die Anwendung ein WMT _ ACQUIRE _ LICENSE-Ereignis. Für alle Lizenzen der Version 7 wird empfohlen, dass Anwendungen Benutzern die Möglichkeit geben, Lizenzen unbeaufsichtigt oder nicht unbeaufsichtigt abzurufen.
WMT _ NO _ RIGHTS _ EX
Das WMT _ NO RIGHTS _ _ EX-Ereignis gibt an, dass der Inhalt durch DRM Version 7 geschützt ist. Daher kann der Lizenzerwerbsprozess entweder im Hintergrund oder nicht im Hintergrund fortgesetzt werden. Im Allgemeinen ist der automatische Lizenzerwerb für Endbenutzer praktischer, obwohl einige Benutzer es vorziehen, alle Lizenzen nicht im Hintergrund zu erwerben. Wenn der Lizenzerwerb erfordert, dass der Benutzer Zahlungs- oder persönliche Informationen übermittelt, sollte der Prozess immer nicht im Hintergrund ausgeführt werden. Der nicht automatische Lizenzerwerb wird oben unter der Überschrift WMT _ NO _ RIGHTS beschrieben. Die unbeaufsichtigten Übernahmen werden wie folgt fortgesetzt:
- Umwandlung des pValue-Parameters in eine WM GET LICENSE _ _ _ DATA-Struktur und Speichern der Struktur für den Fall, dass sie später für den nicht automatischen Lizenzerwerb benötigt wird.
- Rufen Sie QueryInterface für das Readerobjekt auf, um die IWMDRMReader-Schnittstelle abzurufen.
- Rufen Sie IWMDRMReader::AcquireLicense auf, und geben Sie 0x1 im dwFlags-Parameter an, um den automatischen Spracherwerb anzugeben. Dies ist ein asynchroner Aufruf, der sofort zurückgegeben wird.
- Warten Sie auf das WMT _ ACQUIRE _ LICENSE-Ereignis.
WMT _ ERWERBEN _ EINER LIZENZ
Das WMT _ ACQUIRE _ LICENSE-Ereignis wird gesendet, nachdem der Lizenzerwerbsprozess für eine DRM-Lizenz der Version 7 abgeschlossen wurde. IWMDRMReader::AcquireLicense bewirkt, dass dieses Ereignis für den automatischen Erwerb gesendet wird, und MonitorLicenseAcquisition bewirkt, dass es für den nicht automatischen Erwerb gesendet wird. Umwandlung von pValue in einen Zeiger auf eine WM GET LICENSE _ _ _ DATA-Struktur in Ihrem Ereignishandler und Untersuchen des hr-Members, um zu ermitteln, ob die Lizenz erfolgreich erworben wurde. Wenn hr gleich NS _ E _ DRM NO RIGHTS _ _ ist, bedeutet dies, dass die Lizenz nicht im Hintergrund erworben werden muss. Anwendungen sollten es Benutzern ermöglichen, den Lizenzerwerbsprozess jederzeit abzubrechen. Dazu wird IWMDRMReader::CancelLicenseAcquisitionaufgerufen. Wenn Sie diese Methode aufrufen, wird ein WMT _ ACQUIRE _ LICENSE-Ereignis mit dem HRESULT-Wert NS _ S _ DRM ACQUIRE _ _ CANCELLED gesendet.
Wenn hr gleich NS _ S _ DRM LICENSE ACQUIRED _ _ ist, wurde die Lizenz erworben, und die Anwendung kann versuchen, die Datei wiederzuspielen, sie auf ein Gerät zu kopieren oder eine aktion auszuführen, für die sie Rechte angefordert hat.
Auf Windows XP wurde ein neuer Fehlercode eingeführt: NS _ E _ DRM _ LICENSE _ NOTACQUIRED. Dieser Fehlercode wird generiert, wenn die Windows Media Format-Laufzeitkomponenten auf Windows XP während des unbeaufsichtigten oder nicht automatischen Lizenzerwerbs keine Lizenz erwerben können. Auf anderen Plattformen wird _ NS E _ DRM _ LICENSE STORE ERROR in der Regel _ _ zurückgegeben, wenn der Lizenzerwerb fehlschlägt. Der neue Fehlercode soll lizenzerwerbsfehler von anderen Fehlerbedingungen unterscheiden, bei denen NS _ E _ DRM _ LICENSE STORE ERROR _ generiert _ wird.
Die empfohlene Vorgehensweise zum Behandeln dieser Fehler, wenn sie nach einem unbeaufsichtigten Lizenzerwerbsversuch zurückgegeben werden, wird im folgenden Codeausschnitt gezeigt:
if( hrStatus == NS_E_DRM_LICENSE_NOTACQUIRED ||
hrStatus == NS_E_DRM_LICENSE_STORE_ERROR )
{
// Attempt non-silent license acquisition.
}
else if( hrStatus == NS_E_DRM_NEEDS_INDIVIDUALIZATION )
{
// Individualize and then retry.
}
else if( FAILED(hrStatus) )
{
// Display a helpful error message.
}
else
{
// Success. Play content.
}
Hinweis
DRM wird von der x64-basierten Version dieses SDK nicht unterstützt.