次の方法で共有


ライセンス取得イベントの処理

[このページに関連付けられている機能である Windows Media Format 11 SDK は、従来の機能です。 ソース リーダーシンク ライターに置き換わりました。 ソース リーダーシンク ライターは、Windows 10とWindows 11用に最適化されています。 Microsoft では、可能であれば、新しいコードで Windows Media Format 11 SDK ではなくソース リーダーシンク ライターを使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

DRM 対応リーダー アプリケーションは、 IWMStatusCallback::OnStatus コールバック メソッドで、ライセンス取得プロセスに関連する次の 4 つのイベントを処理します。

  • WMT_LICENSEURL_SIGNATURE_STATE
  • WMT_NO_RIGHTS
  • WMT_NO_RIGHTS_EX
  • WMT_ACQUIRE_LICENSE

WMT_LICENSEURL_SIGNATURE_STATE

DRM コンポーネントは、DRM バージョン 7 で保護されているコンテンツを検出すると、最初にローカル システムで有効なライセンスを検索します。 存在しない場合は、ファイルの DRM ヘッダー内のライセンス取得 URL が評価され、pValueWMT_DRMLA_TRUST値のいずれかに設定されたWMT_LICENSEURL_SIGNATURE_STATE イベントが送信され、URL が信頼されているか、信頼されていないか、改ざんされているかが示されます。 URL が信頼されていない場合、アプリケーションはユーザーに警告する必要があります。 URL が改ざんされている場合、ファイルは破損したと見なされ、アプリケーションはユーザーに強い警告を出さずに URL に移動しないでください。

WMT_NO_RIGHTS

WMT_NO_RIGHTS イベントは DRM バージョン 1 のコンテンツに対してのみ送信されます。つまり、ライセンスはサイレントモードで取得する必要があります。 つまり、ユーザーは Web ページに移動してライセンスを取得する必要があります。 ページの URL は、OnStatus メソッドの pValue パラメーターからワイド文字の null で終わる文字列として取得されます。

必要に応じて、アプリケーションを使用すると、インターネット エクスプローラーを別のプロセスで開くか、Web ブラウザー コントロールをホストすることによって、ユーザーが Web ページに簡単に移動できるようになります。 ただし、これは必須ではありません。 少なくとも、アプリケーションは単にメッセージ ボックスにユーザーの URL を表示し、インターネット エクスプローラーのアドレス バーに貼り付けるよう求めることができます。 Audioplayer サンプルは、URL 文字列の書式設定方法、CreateProcess メソッドを使用してインターネット エクスプローラーを開き、指定した URL に移動する方法など、WMT_NO_RIGHTS イベントの適切な処理を示しています。

アプリケーションには 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 は非サイレント取得のために送信されます。 イベント ハンドラーで、 pValueWM_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.
}

Note

DRM は、この SDK の x64 ベースのバージョンではサポートされていません。

 

保護されたファイルの読み取り