Обработка событий приобретения лицензий
[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является функцией наследия. Он был заменен средства чтения источника и записи приемника. средства чтения источников и записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует при разработке нового кода использовать компонент Source Reader и компонент Sink Writer вместо пакета SDK для Windows Media Format 11, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Приложение для чтения с функцией поддержки DRM в методе обратного вызова IWMStatusCallback::OnStatus обрабатывает следующие четыре события, связанные с процессом получения лицензий:
- WMT_LICENSEURL_SIGNATURE_STATE
- НЕТ ПРАВ
- WMT_NO_RIGHTS_EX
- WMT_ACQUIRE_LICENSE
WMT_LICENSEURL_SIGNATURE_STATE
Когда компонент DRM обнаруживает содержимое, защищенное DRM версии 7, сначала ищет допустимую лицензию на локальной системе. Если такого нет, он проверяет URL-адрес получения лицензии в заголовке DRM файла и отправляет событие WMT_LICENSEURL_SIGNATURE_STATE, задает pValue как одно из значений WMT_DRMLA_TRUST, указывающее на то, является ли URL-адрес доверенным, ненадежным или измененным. Если URL-адрес не является доверенным, приложение должно предупредить пользователя. Если URL-адрес был изменен, файл должен считаться поврежденным, и приложение не должно переходить к URL-адресу, не выдавая строгое предупреждение пользователю.
WMT_NO_RIGHTS
Событие WMT_NO_RIGHTS отправляется только для содержимого DRM версии 1, что означает, что лицензия должна быть приобретена не автоматически. Другими словами, пользователь должен перейти на веб-страницу, чтобы получить лицензию. URL-адрес страницы извлекается в виде строки, завершаемой значением NULL, из параметра pValue в методе OnStatus.
При необходимости приложение может упростить переход пользователя на веб-страницу, открыв Internet Explorer в отдельном процессе или в другом случае, размещая элемент управления веб-браузером. Однако это не обязательно. По крайней мере, приложение может просто отобразить URL-адрес пользователя в окне сообщения и предложить им вставить его в адресную строку Internet Explorer. В Audioplayer демонстрируется правильная обработка события WMT_NO_RIGHTS, включая форматирование строки URL-адреса и использование метода CreateProcess для открытия Internet Explorer и перехода по указанному URL-адресу.
Так как приложение не может знать, когда лицензия DRM версии 1 была приобретена, пользователь пытается снова открыть файл после получения лицензии.
Этот же процесс приобретения лицензий без использования тихого режима также можно использовать для лицензий версии 7, но в этом случае приложение может сначала вызывать IWMDRMReader::MonitorLicenseAcquisition. Этот метод приведет к повторной проверке локального хранилища лицензий до тех пор, пока не будет найдена лицензия на новый файл. На этом этапе приложение получит событие WMT_ACQUIRE_LICENSE. Для всех лицензий версии 7 рекомендуется предоставить пользователям возможность получения лицензий в фоновом режиме или с подтверждением действий.
WMT_NO_RIGHTS_EX
Событие WMT_NO_RIGHTS_EX указывает, что содержимое защищено DRM версии 7, поэтому процесс получения лицензии может осуществляться в фоновом режиме или с уведомлением. Как правило, автоматическое приобретение лицензий удобнее для конечных пользователей, хотя некоторые люди предпочитают приобретать все лицензии безмолвно. Если приобретение лицензии требует от пользователя отправки оплаты или личных сведений, процесс всегда должен выполняться явно. Приобретение лицензии с явным лицензированием описано выше в разделе WMT_NO_RIGHTS заголовка. Тихое приобретение происходит следующим образом:
- Приведите параметр pValue к структуре WM_GET_LICENSE_DATA и сохраните структуру в случае необходимости в будущем для получения лицензий не в тихом режиме.
- Вызовите QueryInterface на объекте Reader для получения интерфейса IWMDRMReader .
- Вызовите IWMDRMReader::AcquireLicense и укажите 0x1 в параметре dwFlags, чтобы указать тихое получение лицензии. Это асинхронный вызов, который возвращается немедленно.
- Дождитесь события WMT_ACQUIRE_LICENSE.
WMT_ACQUIRE_LICENSE
Событие WMT_ACQUIRE_LICENSE отправляется после завершения процесса приобретения лицензии для лицензии DRM версии 7. IWMDRMReader::AcquireLicense приводит к отправке этого события для тихого приобретения, а MonitorLicenseAcquisition приводит к отправке этого события для нетихого приобретения. В обработчике событий преобразуйте pValue в указатель на структуру WM_GET_LICENSE_DATA и проверьте член hr, чтобы определить, была ли лицензия успешно приобретена. Если hr равен NS_E_DRM_NO_RIGHTS, это означает, что лицензия должна быть приобретена вручную. Приложения должны разрешать пользователям отменять процесс приобретения лицензий в любое время. Это делается путем вызова IWMDRMReader::CancelLicenseAcquisition. Вызов этого метода приведет к отправке события WMT_ACQUIRE_LICENSE с результатом HRESULT, равным NS_S_DRM_ACQUIRE_CANCELLED.
Если hr равно NS_S_DRM_LICENSE_ACQUIRED, то лицензия была приобретена, и приложение может попытаться воспроизвести файл, скопировать его на устройство или выполнить любое действие, на которое у него есть права.
В Windows XP появился новый код ошибки: NS_E_DRM_LICENSE_NOTACQUIRED. Этот код ошибки создается всякий раз, когда компоненты времени выполнения формата Windows Media в Windows XP не получают лицензию во время автоматического или ручного приобретения лицензий. На других платформах NS_E_DRM_LICENSE_STORE_ERROR обычно возвращается при сбое приобретения лицензии. Новый код ошибки предназначен для различения сбоя приобретения лицензий от других условий сбоя, в которых создается NS_E_DRM_LICENSE_STORE_ERROR.
Рекомендуемый способ обработки этих ошибок, когда они возвращены после беззвучной попытки приобретения лицензии, показан в следующем фрагменте кода:
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.
}
Заметка
DRM не поддерживается версией этого пакета SDK на основе x64.
Связанные разделы