Abilitazione delle notifiche
Windows Media Gestione dispositivi dichiara quattro interfacce che un'applicazione può implementare in una classe COM per ricevere notifiche evento. Queste interfacce rientrano in due gruppi, come illustrato nella tabella seguente.
Interfacce | Descrizione |
---|---|
IWMDMNotification | Notifica all'applicazione quando i dispositivi o i supporti di archiviazione sono connessi o disconnessi. |
IWMDMProgress IWMDMProgress2 IWMDMProgress3 |
Un sistema di notifica molto semplice per avvisare un'applicazione sullo stato di avanzamento di qualsiasi evento. L'applicazione non è necessaria per eseguire azioni in risposta a questi messaggi. |
IWMDMNotification
IWMDMNotification avvisa l'applicazione quando Plug and Play dispositivi sono connessi o disconnessi dal computer, nonché quando Plug and Play supporti di archiviazione (ad esempio schede flash) vengono inseriti o rimossi dal dispositivo. Queste notifiche consentono all'applicazione di aggiornare l'interfaccia utente per riflettere le modifiche.
Per ricevere queste notifiche, l'applicazione deve registrarsi per riceverli usando le interfacce IConnectionPointContainer e IConnectionPoint . L'applicazione deve registrarsi per ricevere eventi quando viene avviata e annullare la registrazione quando viene chiusa. Seguire questa procedura per registrare per ricevere queste notifiche.
- Eseguire una query sull'interfaccia IWMDeviceManager principale ricevuta quando è stata autenticata l'applicazione per IConnectionPointContainer.
- Chiamare IConnectionPointContainer::FindConnectionPoint per recuperare un punto di connessione contenitore per le interfacce IWMDMNotification .
- Registrare per ricevere eventi chiamando IConnectionPoint::Advise. Passare la classe che implementa IWMDMNotification e recuperare un cookie, un ID univoco che identifica il punto di connessione. Questa operazione deve essere archiviata e usata in un secondo momento per annullare la registrazione per le notifiche degli eventi.
Il codice C++ seguente illustra come registrare per ricevere notifiche da 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;
}
Quando l'applicazione si chiude, è necessario annullare la registrazione con IConnectionPoint per indicare che non deve più inviare notifiche. Seguire questa procedura per annullare la registrazione per le notifiche:
- Eseguire una query sull'interfaccia IWMDeviceManager principale per IConnectionPointContainer.
- Ottenere un punto di connessione per le interfacce IWMDMNotification .
- Annullare la registrazione dell'applicazione per le notifiche degli eventi chiamando IConnectionPoint::Unadvise, passando l'ID univoco ricevuto quando è stato registrato per ricevere eventi.
Il codice C++ seguente illustra come annullare la registrazione per gli eventi IWMDMNotification quando l'applicazione viene chiusa.
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;
}
Uso di IWMDMProgress
Windows Media Gestione dispositivi può inviare messaggi di stato dell'applicazione quando si verificano azioni specifiche, ad esempio il trasferimento del contenuto, l'acquisizione sicura dell'orologio e l'individuazione delle informazioni sui file DRM. L'applicazione può usare questi messaggi per monitorare lo stato dell'evento o annullare un evento. Per usare questa interfaccia, implementare IWMDMProgress, IWMDMProgress2 o IWMDMProgress3 e passarlo come parametro a un metodo che accetta un messaggio di stato. Si noti che IWMDMProgress3 è l'interfaccia superiore perché fornisce un GUID di identificazione che specifica l'azione rilevata. I metodi dell'applicazione seguenti accettano un'interfaccia di stato (i metodi del provider di servizi corrispondenti devono essere in grado di inviare notifiche a un'interfaccia inviata):
IWMDMStorageGlobals::Initialize
IWMDRMDeviceApp::AcquireDeviceData
Gli esempi di passaggio di un'interfaccia in un metodo vengono forniti nella documentazione per questi metodi. Per esempi di implementazione delle interfacce di callback, vedere la documentazione per i metodi di IWMDMProgress, IWMDMProgress2 o IWMDMProgress3.