处理应用程序中受保护的内容

[Windows Media DRM 功能已弃用,不应使用。 请改用 Microsoft PlayReady。]

应用程序必须具有传输证书才能处理受 DRM 保护的内容。 若要了解从何处获取此证书,请参阅 开发工具。 若要处理未受保护的内容,可以使用对 应用程序进行身份验证中所述的虚拟证书。

在使用设备之前,应用程序应确定设备是否支持适用于便携式设备的 Windows Media DRM 10,如果支持,则 DRM 组件是最新的。 (Current 表示安全时钟正确,并且设备已正确个性化。) 如果设备不支持此版本的 DRM,或者无法更新,则仍可以将文件发送到设备,但它们可能不可播放,具体取决于许可证版本。

注意

目前不支持设备个性化。

 

如果应用程序将链接到 Windows Media Format SDK 方法,则需要链接到 Windows Media Format 库 WMStubDRM.lib。 有关对受 DRM 保护的内容调用 Windows Media Format 方法的详细信息,请参阅 Windows Media Format SDK 文档中的“启用 DRM 支持”。 请注意,链接到 Mssachlp.lib 和 WMStubDRM.lib 时出现问题。 MSDN 上的知识库文章890079对此进行了介绍。

以下 C++ 代码示例确定设备是否为 Windows Media DRM 10 设备,如果是,则确定其时钟是否为最新。

HRESULT IsDRMClockUpToDate()

{
    HRESULT hr = S_OK;

    // Create the DRM handler class.
    CComPtr<IWMDRMDeviceApp> pDRM;
    hr = pDRM.CoCreateInstance(CLSID_WMDRMDeviceApp, 0, CLSCTX_ALL);

    // Find out first if the device is a WMDRM 10 device, and if so,
    // whether it requires clock updates.
    DWORD status = 0;
    hr = pDRM->QueryDeviceStatus(pDevice, &status);

    if (FAILED(hr)
       || (!(WMDRM_DEVICE_ISWMDRM & status)) // Device is not WMDRM 10. 
       || (status & WMDRM_DEVICE_REVOKED))   // Device is revoked.
    {
        return E_FAIL;
    }
    else if (status & WMDRM_DEVICE_NEEDCLOCK || 
        status & WMDRM_DEVICE_REFRESHCLOCK)
    {
        // Attempt update. See following example.
        hr = UpdateDRM(status);
    }
    return hr;
}

如果设备确实支持适用于可移植设备的 Windows Media DRM 10,并且需要更新 (也就是说,如果上一示例中 的状态 值不是简单地WMDM_DEVICE_ISWMDRM) ,则应用程序应调用 IWMDRMDeviceApp::AcquireDeviceData 并传入 status 的值来执行所需的更新。 台式计算机必须连接到 Internet。

以下 C++ 示例函数尝试更新 DRM 设备。

HRESULT UpdateDRM(DWORD status)
{
    HRESULT hr = S_OK;
    hr = pDRM->AcquireDeviceData(pDevice, this, status, &result);
    if (hr != S_OK || result != 0)
    {
            return E_FAIL;
    }
    return hr;
}

创建 Windows Media 设备管理器 应用程序

处理受保护的内容