通知の有効化
Windows Media デバイス マネージャーは、アプリケーションが COM クラスに実装してイベント通知を受信できる 4 つのインターフェイスを宣言します。 これらのインターフェイスは、次の表に示すように 2 つのグループに分類されます。
インターフェイス | 説明 |
---|---|
IWMDMNotification | デバイスまたはストレージ メディアが接続または切断されたときにアプリケーションに通知します。 |
IWMDMProgress IWMDMProgress2 IWMDMProgress3 |
イベントの進行状況についてアプリケーションに警告する非常に単純な通知システム。 アプリケーションは、これらのメッセージに応答してアクションを実行する必要はありません。 |
IWMDMNotification
IWMDMNotification は、プラグ アンド プレイ デバイスがコンピューターに接続または切断されたとき、およびプラグ アンド プレイ記憶域メディア (フラッシュ カードなど) がデバイスに挿入または削除されたときに、アプリケーションに警告します。 これらの通知は、アプリケーションがユーザー インターフェイスを更新して変更を反映するのに役立ちます。
これらの通知を受信するには、アプリケーションがプラットフォーム SDK IConnectionPointContainer インターフェイスと IConnectionPoint インターフェイスを使用して通知を受信するように登録 する 必要があります。 アプリケーションは、起動時にイベントを受信するように登録し、閉じると登録を解除する必要があります。 これらの通知を受信するには、次の手順に従って登録します。
- IConnectionPointContainer 用にアプリケーションを認証したときに受信した IWMDeviceManager インターフェイスメインクエリを実行します。
- IConnectionPointContainer::FindConnectionPoint を呼び出して、IWMDMNotification インターフェイスのコンテナー接続ポイントを取得します。
- IConnectionPoint::Advise を呼び出してイベントを受信するように登録します。 IWMDMNotification を実装する クラスを渡し、接続ポイントを識別する一意の ID である Cookie を取得します。 これは格納し、後でイベント通知の登録を解除するために使用する必要があります。
次の C++ コードは、 IWMDMNotification から通知を受信するために登録する方法を示しています。
HRESULT CWMDMController::RegisterForNotifications()
{
HRESULT hr = S_OK;
CComPtr<IConnectionPointContainer> pConxnPointCont;
CComPtr<IConnectionPoint> pIConnPoint;
// Get the IConnectionPointContainer interface from IWMDeviceManager.
if (SUCCEEDED (hr = m_IWMDMDeviceMgr->QueryInterface(IID_IConnectionPointContainer, (void**) & pConxnPointCont)))
{
// Get a connection point from the container.
if (SUCCEEDED (hr = pConxnPointCont->FindConnectionPoint(IID_IWMDMNotification, &pIConnPoint)))
{
// Add ourselves as a callback handler for the connection point.
// If we succeeded, indicate that by storing the connection point ID.
DWORD dwCookie;
if (SUCCEEDED (hr = pIConnPoint->Advise((IUnknown*)((IWMDMNotification*)this), &dwCookie)))
{
m_dwNotificationCookie = dwCookie;
}
}
}
return hr;
}
アプリケーションが終了したら、 IConnectionPoint で登録を解除して、通知を送信しなくなったことを示す必要があります。 通知の登録を解除するには、次の手順に従います。
- IConnectionPointContainer メイン IWMDeviceManager インターフェイスに対してクエリを実行します。
- IWMDMNotification インターフェイスの接続ポイントを取得します。
- イベント通知のためにアプリケーションの登録を解除するには、 IConnectionPoint::Unadvise を呼び出し、イベントの受信登録時に受信した一意の ID を渡します。
次の C++ コードは、アプリケーションが閉じるときに IWMDMNotification イベントの登録を解除する方法を示しています。
HRESULT CWMDMController::UnregisterForNotifications()
{
HRESULT hr = S_FALSE;
// On class initialization, we initialized the handle to -1 as a flag
// to indicate we had not yet registered for notifications. If registration
// never happened, don't bother to unregister.
if (-1 != m_dwNotificationCookie)
{
CComPtr<IConnectionPointContainer> pConxnPointCont;
CComPtr<IConnectionPoint> pIConnPoint;
// Get the connection point container from IWMDeviceManager.
if (SUCCEEDED (hr =
m_IWMDMDeviceMgr->QueryInterface(IID_IConnectionPointContainer,
(void**) & pConxnPointCont)))
{
// Get a connection point from the container.
if (SUCCEEDED (hr = pConxnPointCont->FindConnectionPoint(IID_IWMDMNotification, &pIConnPoint)))
{
// Remove ourselves as a callback from the connection point.
// If successful, reset the ID to a flag value.
if (SUCCEEDED (hr =
pIConnPoint->Unadvise(m_dwNotificationCookie)))
{
m_dwNotificationCookie = -1;
hr = S_OK;
}
}
}
}
return hr;
}
IWMDMProgress の使用
Windows Media デバイス マネージャーは、コンテンツ転送、セキュリティで保護されたクロック取得、DRM ファイル情報の検出などの特定のアクションが発生したときに、アプリケーションのステータス メッセージを送信できます。 アプリケーションでは、これらのメッセージを使用してイベントの状態を監視したり、イベントを取り消したりすることができます。 このインターフェイスを使用するには、 IWMDMProgress、 IWMDMProgress2、または IWMDMProgress3 を実装し、進行状況メッセージを受け入れるメソッドにパラメーターとして渡します。 IWMDMProgress3 は、追跡対象のアクションを指定する識別 GUID を提供するため、優れたインターフェイスであることに注意してください。 次のアプリケーション メソッドは、進行状況インターフェイスを受け入れます (対応するサービス プロバイダー メソッドは、送信されたインターフェイスに通知を送信できる必要があります)。
IWMDMStorageGlobals::Initialize
IWMDRMDeviceApp::AcquireDeviceData
メソッドにインターフェイスを渡す例については、これらのメソッドのドキュメントを参照してください。 コールバック インターフェイスの実装例については、 IWMDMProgress、IWMDMProgress2、または IWMDMProgress3 のメソッドに関 するドキュメントを参照してください。