Condividi tramite


Gestione degli eventi di acquisizione licenze

[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita da Lettore di origine e Writer sink. Lettore di origine e Writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi Lettore di origine e Writer sink anziché Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Un'applicazione di lettura abilitata per DRM, nel relativo metodo IWMStatusCallback::OnStatus callback , gestisce i quattro eventi seguenti correlati al processo di acquisizione delle licenze:

  • WMT_LICENSEURL_SIGNATURE_STATE
  • WMT_NO_RIGHTS
  • WMT_NO_RIGHTS_EX
  • WMT_ACQUIRE_LICENSE

WMT_LICENSEURL_SIGNATURE_STATE

Quando il componente DRM rileva il contenuto protetto da DRM versione 7, cerca prima di tutto una licenza valida nel sistema locale. Se non esiste, valuta l'URL di acquisizione delle licenze nell'intestazione DRM del file e invia un evento WMT_LICENSEURL_SIGNATURE_STATE con pValue impostato su uno dei valoriWMT_DRMLA_TRUST, che indica se l'URL è attendibile, non attendibile o è stato manomesso. Se l'URL non è attendibile, l'applicazione deve avvisare l'utente. Se l'URL è stato manomesso, il file deve essere considerato danneggiato e l'applicazione non deve passare all'URL senza inviare un avviso sicuro all'utente.

WMT_NO_RIGHTS

L'evento WMT_NO_RIGHTS viene inviato solo per il contenuto DRM versione 1, il che significa che la licenza deve essere acquisita in modo non invisibile all'utente. In altre parole, l'utente deve passare a una pagina Web per acquisire una licenza. L'URL della pagina viene recuperato come stringa con terminazione null a caratteri wide dal parametro pValue nel metodo OnStatus .

Se appropriato, un'applicazione può rendere più semplice per l'utente passare alla pagina Web, aprendo Internet Explorer in un processo separato oppure ospitando il controllo Web Browser. Non è tuttavia necessario. Almeno, un'applicazione potrebbe semplicemente visualizzare l'URL dell'utente in una finestra di messaggio e chiedergli di incollarlo nella barra degli indirizzi di Internet Explorer. L'esempio audioplayer illustra la corretta gestione dell'evento WMT_NO_RIGHTS , incluso come formattare la stringa url e come usare il metodo CreateProcess per aprire Internet Explorer e passare all'URL specificato.

Poiché l'applicazione non ha modo di sapere quando è stata acquisita una licenza DRM versione 1, è possibile che l'utente tenti di aprire di nuovo il file dopo aver acquisito la licenza.

Questo stesso processo di acquisizione delle licenze non invisibile all'utente può essere usato anche per le licenze della versione 7, ma in questo caso l'applicazione può chiamare prima IWMDRMReader::MonitorLicenseAcquisition. Questo metodo causerà la verifica ripetuta dell'archivio licenze locale fino a quando non viene trovata la licenza per il nuovo file. A quel punto, l'applicazione riceverà un evento WMT_ACQUIRE_LICENSE . Per tutte le licenze della versione 7, è consigliabile che le applicazioni ottengano le licenze in modo invisibile o non invisibile all'utente.

WMT_NO_RIGHTS_EX

L'evento WMT_NO_RIGHTS_EX indica che il contenuto è protetto da DRM versione 7 e pertanto il processo di acquisizione delle licenze può procedere in modo invisibile o non invisibile all'utente. In generale, l'acquisizione di licenze invisibile è più conveniente per gli utenti finali, anche se alcune persone preferiscono acquisire tutte le licenze non invisibile all'utente finale. Quando l'acquisizione delle licenze richiede all'utente di inviare i pagamenti o le informazioni personali, il processo deve essere sempre eseguito in modo non invisibile all'utente. L'acquisizione di licenze non invisibile all'utente è descritta in precedenza nell'intestazione WMT_NO_RIGHTS . L'acquisizione invisibile procede come segue:

  1. Eseguire il cast del parametro pValue in una struttura di WM_GET_LICENSE_DATA e archiviare la struttura nel caso in cui sia necessario in seguito per l'acquisizione di licenze non invisibile all'utente.
  2. Chiamare QueryInterface nell'oggetto reader per ottenere l'interfaccia IWMDRMReader .
  3. Chiamare IWMDRMReader::AcquireLicense e specificare 0x1 nel parametro dwFlags per indicare l'acquisizione del linguaggio invisibile all'utente. Si tratta di una chiamata asincrona che restituisce immediatamente.
  4. Attendere l'evento WMT_ACQUIRE_LICENSE .

WMT_ACQUIRE_LICENSE

L'evento WMT_ACQUIRE_LICENSE viene inviato dopo il completamento del processo di acquisizione delle licenze per una licenza DRM versione 7. IWMDRMReader::AcquireLicense causa l'invio di questo evento per l'acquisizione invisibile all'utente e MonitorLicenseAcquisition causa l'invio per l'acquisizione non invisibile all'utente. Nel gestore eventi eseguire il cast pValue in un puntatore a una struttura WM_GET_LICENSE_DATA ed esaminare il membro hr per determinare se la licenza è stata acquisita correttamente. Se hr è uguale a NS_E_DRM_NO_RIGHTS, indica che la licenza deve essere acquisita in modo non invisibile all'utente. Le applicazioni devono consentire agli utenti di annullare il processo di acquisizione delle licenze in qualsiasi momento. Questa operazione viene eseguita chiamando IWMDRMReader::CancelLicenseAcquisition. La chiamata a questo metodo invierà un evento WMT_ACQUIRE_LICENSE con un valore HRESULT di NS_S_DRM_ACQUIRE_CANCELLED.

Se hr è uguale a NS_S_DRM_LICENSE_ACQUIRED, la licenza è stata acquisita e l'applicazione può tentare di riprodurre il file o copiarlo in un dispositivo o eseguire qualsiasi azione per cui aveva richiesto diritti.

In Windows XP è stato introdotto un nuovo codice di errore: NS_E_DRM_LICENSE_NOTACQUIRED. Questo codice di errore viene generato ogni volta che i componenti di run-time di Windows Media Format in Windows XP non riescono a acquisire una licenza durante l'acquisizione di licenze invisibile o non invisibile all'utente. In altre piattaforme, NS_E_DRM_LICENSE_STORE_ERROR viene in genere restituito quando l'acquisizione della licenza ha esito negativo. Il nuovo codice di errore è destinato a distinguere l'errore di acquisizione delle licenze da altre condizioni di errore in cui viene generato NS_E_DRM_LICENSE_STORE_ERROR.

Il modo consigliato per gestire questi errori quando vengono restituiti dopo un tentativo di acquisizione di licenze invisibile all'utente viene mostrato nel frammento di codice seguente:

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.
}

Nota

DRM non è supportato dalla versione basata su x64 di questo SDK.

 

Lettura di file protetti