Condividi tramite


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.

  1. Eseguire una query sull'interfaccia IWMDeviceManager principale ricevuta quando è stata autenticata l'applicazione per IConnectionPointContainer.
  2. Chiamare IConnectionPointContainer::FindConnectionPoint per recuperare un punto di connessione contenitore per le interfacce IWMDMNotification .
  3. 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:

  1. Eseguire una query sull'interfaccia IWMDeviceManager principale per IConnectionPointContainer.
  2. Ottenere un punto di connessione per le interfacce IWMDMNotification .
  3. 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):

IWMDMStorageControl::D elete

IWMDMStorageControl::Insert

IWMDMStorageControl::Move

IWMDMStorageControl::Read

IWMDMStorageControl::Rinomina

IWMDMStorageControl2::Insert2

IWMDMStorageControl3::Insert3

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.

Creazione di un'applicazione windows Media Gestione dispositivi