共用方式為


處理授權取得事件

[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows 媒體格式 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 會從OnStatus方法中的pValue參數擷取為寬字元 Null 終止字串。

如果適當的話,應用程式可以讓使用者更輕鬆地流覽至網頁,方法是在不同的進程中開啟 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。 無訊息擷取會繼續,如下所示:

  1. pValue 參數轉換成 WM_GET_LICENSE_DATA 結構,並儲存結構,以防稍後需要進行非無訊息授權取得。
  2. 在讀取器物件上呼叫 QueryInterface 以取得 IWMDRMReader 介面。
  3. 呼叫 IWMDRMReader::AcquireLicense ,並在 dwFlags 參數中指定0x1,以指出無訊息語言取得。 這是立即傳回的非同步呼叫。
  4. 等候 WMT_ACQUIRE_LICENSE 事件。

WMT_ACQUIRE_LICENSE

在 DRM 第 7 版授權完成授權取得程式之後,就會傳送 WMT_ACQUIRE_LICENSE 事件。 IWMDRMReader::AcquireLicense 會使此事件傳送以進行無訊息取得, 而 MonitorLicenseAcquisition 會使它傳送給非無訊息取得。 在事件處理常式中,將 pValue 轉換成 WM_GET_LICENSE_DATA 結構的指標,並檢查 hr 成員,以判斷是否已成功取得授權。 如果 hr 等於 NS_E_DRM_NO_RIGHTS,表示授權必須以非無訊息方式取得。 應用程式應該讓使用者隨時取消授權取得程式。 這是藉由呼叫 IWMDRMReader::CancelLicenseAcquisition來完成。 呼叫此方法會傳送具有HRESULTNS_S_DRM_ACQUIRE_CANCELLED的 WMT_ACQUIRE_LICENSE事件。

如果 hr 等於NS_S_DRM_LICENSE_ACQUIRED,則已取得授權,且應用程式可以嘗試播放檔案,或將其複製到裝置,或執行要求許可權的任何動作。

在 Windows XP 上,引進了新的錯誤碼:NS_E_DRM_LICENSE_NOTACQUIRED。 每當 Windows XP 上的 Windows 媒體格式執行時間元件在無訊息或非無訊息授權取得期間無法取得授權時,就會產生此錯誤碼。 在其他平臺上,通常會在授權取得失敗時傳回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。

 

讀取受保護的檔案