IWMDRMDeviceApp::GenerateMeterChallenge 方法

GenerateMeterChallenge 方法从设备获取计量数据。

语法

HRESULT GenerateMeterChallenge(
  [in]  IWMDMDevice *pDevice,
  [in]  BSTR        bstrMeterCert,
  [out] BSTR        *pbstrMeterURL,
  [out] BSTR        *pbstrMeterData
);

参数

pDevice [in]

指向 IWMDMDevice 接口的指针。 如果应用程序以 NULL 传递,则使用计算机上存储的计量信息,而不是来自已连接设备的计量信息。

bstrMeterCert [in]

应用程序的计量证书,作为 BSTR。 这是从 Microsoft 收到的已签名证书。

pbstrMeterURL [out]

应在其中发送计量数据的 URL。 这由 Windows Media 设备管理器分配,并且必须由调用方使用 SysFreeString 释放。

pbstrMeterData [out]

要发送到计量服务的计量数据。 这由 Windows Media 设备管理器分配,并且必须由调用方使用 SysFreeString 释放。

返回值

该方法返回 HRESULT。 可能的值包括(但并不限于)下表中的项。

返回代码 说明
S_OK
方法成功。
DRM_E_INVALIDARG
一个或多个参数无效。
DRM_E_INVALIDXMLTAG
XML 格式不正确。
DRM_E_NOXMLCLOSETAG
XML 格式不正确。
DRM_E_NOXMLOPENTAG
XML 格式不正确。
DRM_E_XMLNOTFOUND
找不到所需的 XML 标记。
来自设备的错误
任意数量的设备错误。
来自 DRM 客户端的错误
任意数量的内部 DRM 客户端错误。
NS_E_DEVICE_NOT_WMDRM_DEVICE
指定的设备不是与 Windows Media DRM 兼容的设备。

备注

在调用此方法之前,应用程序应调用 IWMDRMDeviceApp::QueryDeviceStatusIWMDRMDeviceApp2::QueryDeviceStatus2 ,以验证设备的所有 DRM 组件是否为最新。 只能在支持适用于可移植设备的 Windows Media DRM 10 的设备上调用此方法。

检索到的数据 pbstrMeterData 应发送到 pbstrMeterURL 指定的 URL。 请务必对检索到的数据进行 URL 编码,以免在传输过程中对其进行修改。

有关详细信息 ,请参阅处理应用程序中的受保护内容

示例

以下 C++ 代码示例创建 WMDRMDeviceApp 对象,验证设备是 Windows Media DRM 10 设备,其时钟是否准确,然后请求计量数据。

HRESULT hr = S_OK;
// Create the WMDRMDeviceApp object.
CComPtr<IWMDRMDeviceApp> pDRM;
hr = pDRM.CoCreateInstance(CLSID_WMDRMDeviceApp, 0, CLSCTX_ALL);

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

if (!(WMDRM_DEVICE_ISWMDRM & status)) // Device is not WMDRM 10. Nothing can be updated,
    return E_FAIL;                   // and metering cannot be performed.
else if (status & WMDRM_DEVICE_REVOKED) // Device is revoked.
    return E_FAIL;
else if (status & WMDRM_DEVICE_NEEDCLOCK || 
    status & WMDRM_CLIENT_NEEDINDIV ||
    status & WMDRM_DEVICE_REFRESHCLOCK)
{
    // Need to update device clock. 
    // Using custom function, which is synchronous.
    hr = myAcquireDeviceData(pDRM, pDevice, this, status, &result);
    if (hr != S_OK || result != 0)    // Couldn't perform the updates.
        return E_FAIL;    
}

// Any updates have been performed. Now get the metering information from the device.
CComBSTR meterCert(METERCERT);
CComBSTR URL;
CComBSTR rawdata;
CComBSTR data;
hr = pDRM->GenerateMeterChallenge(pDevice, meterCert, &URL, &rawdata);
if (hr == S_OK)
    ..... Send to URL...

要求

要求 Value
标头
WMDRMDeviceApp.h (还需要Wmdrmdeviceapp_i.c,这是从 WMDRMDeviceApp.idl)

Mssachlp.lib

另请参阅

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

IWMDMDevice 接口

IWMDRMDeviceApp 接口