Aktivieren von Benachrichtigungen
Windows Media Geräte-Manager deklariert vier Schnittstellen, die eine Anwendung in einer COM-Klasse implementieren kann, um Ereignisbenachrichtigungen zu empfangen. Diese Schnittstellen sind in zwei Gruppen unterteilt, wie in der folgenden Tabelle dargestellt.
Schnittstellen | BESCHREIBUNG |
---|---|
IWMDMNotification | Benachrichtigt die Anwendung, wenn Geräte oder Speichermedien verbunden oder getrennt sind. |
IWMDMProgress IWMDMProgress2 IWMDMProgress3 |
Ein sehr einfaches Benachrichtigungssystem, um eine Anwendung über den Fortschritt eines beliebigen Ereignisses zu benachrichtigen. Die Anwendung muss keine Aktionen als Reaktion auf diese Meldungen ergreifen. |
IWMDMNotification
IWMDMNotification warnt die Anwendung, wenn Plug & Play Geräte verbunden oder vom Computer getrennt sind, sowie wenn Plug & Play Speichermedien (z. B. Flashkarten) eingefügt oder aus dem Gerät entfernt werden. Diese Benachrichtigungen können der Anwendung helfen, ihre Benutzeroberfläche zu aktualisieren, um Änderungen widerzuspiegeln.
Um diese Benachrichtigungen zu erhalten, muss sich Ihre Anwendung registrieren, um sie über die Platform SDK-Schnittstellen IConnectionPointContainer und IConnectionPoint zu empfangen. Ihre Anwendung sollte sich registrieren, um Ereignisse zu empfangen, wenn sie gestartet wird, und die Registrierung aufheben, wenn sie geschlossen wird. Führen Sie die folgenden Schritte aus, um sich zu registrieren, um diese Benachrichtigungen zu erhalten.
- Fragen Sie die Standard IWMDeviceManager-Schnittstelle ab, die Sie bei der Authentifizierung Ihrer Anwendung für IConnectionPointContainer erhalten haben.
- Rufen Sie IConnectionPointContainer::FindConnectionPoint auf, um einen Containerverbindungspunkt für IWMDMNotification-Schnittstellen abzurufen.
- Registrieren Sie sich, um Ereignisse zu empfangen, indem Sie IConnectionPoint::Advise aufrufen. Übergeben Sie die Klasse, die IWMDMNotification implementiert, und rufen Sie ein Cookie ab, eine eindeutige ID, die Ihren Verbindungspunkt identifiziert. Dies muss gespeichert und später verwendet werden, um die Registrierung für Ereignisbenachrichtigungen aufzuheben.
Der folgende C++-Code veranschaulicht, wie Sie sich registrieren können, um Benachrichtigungen von IWMDMNotification zu erhalten.
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;
}
Wenn Ihre Anwendung geschlossen wird, müssen Sie die Registrierung bei IConnectionPoint aufheben, um anzugeben, dass sie Ihnen keine Benachrichtigungen mehr senden soll. Führen Sie die folgenden Schritte aus, um die Registrierung für Benachrichtigungen aufzuheben:
- Fragen Sie die Standard IWMDeviceManager-Schnittstelle für IConnectionPointContainer ab.
- Rufen Sie einen Verbindungspunkt für IWMDMNotification-Schnittstellen ab.
- Heben Sie die Registrierung Ihrer Anwendung für Ereignisbenachrichtigungen auf, indem Sie IConnectionPoint::Unadvise aufrufen, und übergeben Sie die eindeutige ID, die Sie erhalten haben, wenn Sie sich für den Empfang von Ereignissen registriert haben.
Der folgende C++-Code zeigt, wie Sie die Registrierung für IWMDMNotification-Ereignisse aufheben, wenn Ihre Anwendung geschlossen wird.
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;
}
Verwenden von IWMDMProgress
Windows Media-Geräte-Manager können Ihre Anwendung status Nachrichten senden, wenn bestimmte Aktionen wie Inhaltsübertragung, sichere Uhrenerfassung und DAS Auftreffen von DRM-Dateiinformationen auftreten. Ihre Anwendung kann diese Meldungen verwenden, um die status des Ereignisses zu überwachen oder ein Ereignis abzubrechen. Um diese Schnittstelle zu verwenden, implementieren Sie IWMDMProgress, IWMDMProgress2 oder IWMDMProgress3, und übergeben Sie sie als Parameter an eine Methode, die eine Statusmeldung akzeptiert. Beachten Sie, dass IWMDMProgress3 die überlegene Schnittstelle ist, da sie eine Identifikations-GUID bereitstellt, die angibt, welche Aktion nachverfolgt wird. Die folgenden Anwendungsmethoden akzeptieren eine Fortschrittsschnittstelle (die entsprechenden Dienstanbietermethoden sollten in der Lage sein, Benachrichtigungen an eine übermittelte Schnittstelle zu senden):
IWMDMStorageGlobals::Initialize
IWMDRMDeviceApp::AcquireDeviceData
Beispiele für das Übergeben einer Schnittstelle an eine Methode finden Sie in der Dokumentation zu diesen Methoden. Beispiele für die Implementierung der Rückrufschnittstellen finden Sie in der Dokumentation zu den Methoden von IWMDMProgress, IWMDMProgress2 oder IWMDMProgress3.