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 lassen sich wie in der folgenden Tabelle dargestellt in zwei Gruppen unterteilen.
| 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 Ereignisses zu warnen. Die Anwendung muss keine Aktionen als Reaktion auf diese Meldungen ausführen. |
IWMDMNotification
IWMDMNotification alerts the application when Plug and Play devices are connected or disconnected from the computer, as well as when Plug and Play storage media (such as flash cards) are inserted or removed from the device. Diese Benachrichtigungen können der Anwendung helfen, ihre Benutzeroberfläche zu aktualisieren, um Änderungen widerzu spiegeln.
Um diese Benachrichtigungen zu erhalten, muss sich Ihre Anwendung registrieren, um sie über die IConnectionPointContainer- und IConnectionPoint-Schnittstellen des Plattform-SDK zu empfangen. Ihre Anwendung sollte sich registrieren, um Beim Start Ereignisse zu empfangen, und die Registrierung beim Schließen aufheben. Führen Sie die folgenden Schritte aus, um sich für den Empfang dieser Benachrichtigungen zu registrieren.
- Fragen Sie die Hauptschnittstelle IWMDeviceManager ab, die Sie beim Authentifizieren 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. Diese muss gespeichert und später zum Aufheben der Registrierung für Ereignisbenachrichtigungen verwendet werden.
Der folgende C++-Code veranschaulicht, wie Sie sich registrieren können, um Benachrichtigungen von IWMDMNotification zu empfangen.
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 zu aufheben:
- Fragen Sie die Hauptschnittstelle VON IWMDeviceManager für IConnectionPointContainer ab.
- Hier erhalten Sie einen Verbindungspunkt für IWMDMNotification-Schnittstellen.
- Deaktivieren Sie die Registrierung Ihrer Anwendung für Ereignisbenachrichtigungen, indem Sie IConnectionPoint::Unadvise aufrufen und die eindeutige ID übergeben, die sie erhalten haben, als Sie sich für den Empfang von Ereignissen registriert haben.
Der folgende C++-Code zeigt, wie die Registrierung für IWMDMNotification-Ereignisse aufgehoben wird, 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 Medien Geräte-Manager können Ihre Anwendungsstatusmeldungen senden, wenn bestimmte Aktionen, z. B. Inhaltsübertragung, sicherer Uhrerfassung und Auftreffen von DRM-Dateiinformationen, auftreten. Ihre Anwendung kann diese Nachrichten verwenden, um den Status des Ereignisses zu überwachen oder ein Ereignis abzubricht. Um diese Schnittstelle zu verwenden, implementieren Sie IWMDMProgress, IWMDMProgress2oder IWMDMProgress3und übergeben sie als Parameter an eine Methode, die eine Statusmeldung akzeptiert. Beachten Sie, dass IWMDMProgress3 die übergeordnete Schnittstelle ist, da sie eine Identifikations-GUID bietet, die angibt, welche Aktion nachverfolgt wird. Die folgenden Anwendungsmethoden akzeptieren eine Statusschnittstelle (die entsprechenden Dienstanbietermethoden sollten in der Lage sein, Benachrichtigungen an eine übermittelte Schnittstelle zu senden):
IWMDMStorageGlobals::Initialize
IWMDRMDeviceApp::AcquireDeviceData
Beispiele für die Übergabe einer Schnittstelle an eine Methode finden Sie in der Dokumentation für diese Methoden. Beispiele für die Implementierung der Rückrufschnittstellen finden Sie in der Dokumentation zu den Methoden von IWMDMProgress, IWMDMProgress2 oder IWMDMProgress3.