处理许可证获取事件

[与此页面关联的功能 Windows Media Format 11 SDK 是旧版功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用源读取器和接收器编写器,而不是 Windows Media Format 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

已启用 DRM 的读取器应用程序在其 IWMStatusCallback::OnStatus 回调方法中处理与许可证获取过程相关的以下四个事件:

  • WMT_LICENSEURL_SIGNATURE_STATE
  • WMT_NO_RIGHTS
  • WMT_NO_RIGHTS_EX
  • WMT_ACQUIRE_LICENSE

WMT_LICENSEURL_SIGNATURE_STATE

当 DRM 组件检测到受 DRM 版本 7 保护的内容时,它首先在本地系统上查找有效的许可证。 如果不存在,则它会评估文件的 DRM 标头中的许可证获取 URL,并将 pValue 设置为WMT_DRMLA_TRUST值之一的WMT_LICENSEURL_SIGNATURE_STATE事件发送,指示 URL 是受信任、不受信任还是已被篡改。 如果 URL 不受信任,则应用程序应警告用户。 如果 URL 已被篡改,则应将该文件视为已损坏,并且应用程序不应在不向用户发出强警告的情况下导航到 URL。

WMT_NO_RIGHTS

WMT_NO_RIGHTS 事件仅针对 DRM 版本 1 内容发送,这意味着必须以非无提示方式获取许可证。 换句话说,用户必须导航到网页才能获取许可证。 页面的 URL 作为宽字符 null 结尾的字符串从 OnStatus 方法中的 pValue 参数检索。

如果合适,应用程序可以通过在单独的进程中打开 Internet Explorer 或通过托管 Web 浏览器控件来更轻松地导航到网页。 但是,这不是必需的。 应用程序至少可以在消息框中向用户显示 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 标题下介绍了非无提示许可证获取。 无提示获取过程如下:

  1. pValue 参数强制转换为 WM_GET_LICENSE_DATA 结构,并存储结构,以防以后非无提示许可证获取需要它。
  2. 在读取器对象上调用 QueryInterface 以获取 IWMDRMReader 接口。
  3. 调用 IWMDRMReader::AcquireLicense 并在 dwFlags 参数中指定0x1以指示无提示语言获取。 这是立即返回的异步调用。
  4. 等待 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 来完成的。 调用此方法将发送 HRESULT 值为 NS_S_DRM_ACQUIRE_CANCELLED 的WMT_ACQUIRE_LICENSE事件。

如果 hr 等于NS_S_DRM_LICENSE_ACQUIRED,则表示已获取许可证,应用程序可以尝试播放文件,或将其复制到设备或执行其请求权限的任何操作。

在 Windows XP 上,引入了新的错误代码:NS_E_DRM_LICENSE_NOTACQUIRED。 每当 Windows XP 上的 Windows Media Format 运行时组件在无提示或非无提示许可证获取期间未能获取许可证时,都会生成此错误代码。 在其他平台上,当许可证获取失败时,通常会返回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.
}

注意

此 SDK 的基于 x64 的版本不支持 DRM。

 

读取受保护的文件