Condividi tramite


Implementazione di un consumer fisico

Un consumer fisico è un oggetto COM che implementa l'interfaccia IWbemUnboundObjectSink . WMI carica il consumer fisico e passa gli eventi tramite IWbemUnboundObjectSink in risposta a uno o più eventi, come definito dal consumer logico associato. I consumatori permanenti hanno requisiti di sicurezza speciali. Per altre informazioni, vedere Protezione degli eventi WMI.

La procedura seguente descrive come implementare un consumer fisico per un consumer di eventi permanente.

Per implementare un consumer fisico per un consumer di eventi permanente

  1. Creare un oggetto COM.

    È necessario implementare un consumer fisico come server locale o remoto usando il protocollo COM.

  2. Determinare se si vuole supportare la notifica degli eventi sincrona o asincrona.

    Con la notifica degli eventi asincrona, il thread di invio non è correlato al thread ricevente. Pertanto, né WMI né il provider di eventi viene bloccato mentre WMI recapita una notifica a qualsiasi consumer registrato per ricevere l'evento. Lo svantaggio del recapito asincrono è che si verifica un cambio di contesto tra il momento in cui il provider produce l'evento e il momento in cui il consumer riceve l'evento. Per altre informazioni sul funzionamento asincrono, vedere l'argomento Concetti fondamentali COM nella sezione COM di Microsoft Windows Software Development Kit (SDK). Per altre informazioni sui cambi di contesto, vedere l'argomento Opzioni di contesto nella sezione DLL, processi e thread di Windows SDK.

    Nota

    Poiché il callback al sink potrebbe non essere restituito allo stesso livello di autenticazione richiesto dal client, è consigliabile usare la comunicazione semiincrona anziché la comunicazione asincrona. Per altre informazioni, vedere Chiamata di un metodo.

     

    Con la notifica sincrona, WMI recapita la notifica sullo stesso thread usato dal provider di eventi per recapitare l'evento a WMI. In questo caso, quando un provider di eventi invia una notifica, il provider di eventi viene bloccato da WMI fino a quando WMI non recapita la notifica. Solo se il consumer è estremamente veloce e può elaborare un evento in 100 microsecondi o meno se si consiglia di supportare la notifica sincrona. I consumer sincroni che richiedono troppo tempo per elaborare gli eventi possono rallentare seriamente il recapito degli eventi a tutti gli altri consumer. Inoltre, possono bloccare inavvertitamente il provider. Per altre informazioni, vedere Associazione di un filtro eventi con un consumer logico.

  3. Implementare la funzione IWbemUnboundObjectSink::IndicateToConsumer .

    WMI usa la funzione IndicateToConsumer per passare i puntatori e gli eventi necessari al consumer fisico per le comunicazioni sincrone e asincrone. L'implementazione di IndicateToConsumer deve contenere tutto il codice necessario per rispondere a un evento.

    A differenza di un consumer di eventi temporanei, non è necessario chiamare l'interfaccia IWbemLocator per contattare WMI. WMI individua invece un puntatore al consumer tramite il provider di consumer di eventi. Per altre informazioni, vedere Scrittura di un provider di consumer di eventi.

    Tuttavia, se si vuole eseguire il callback in WMI, usare le interfacce IWbemLocator e IWbemServices . Il metodo tradizionale per la connessione a WMI è durante il processo di inizializzazione dell'oggetto COM. Per altre informazioni, vedere Creazione di un'applicazione WMI o di uno script.

    Se si implementa il consumer fisico come server COM in-process e ci si connette a WMI separatamente dal processo di inizializzazione, è necessario usare l'identificatore di classe CLSID_WbemAdministrativeLocator per accedere all'interfaccia IWbemLocator nella chiamata a CoCreateInstance.

    Nell'esempio seguente viene illustrato come usare l'identificatore di classe CLSID_WbemAdministrativeLocator per accedere all'interfaccia IWbemLocator .

    IWbemLocator *pLoc = 0;
    
    DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, 
        CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
    

    L'interfaccia IWbemLocator ottiene il puntatore dello spazio dei nomi iniziale a WMI in un determinato computer host. Se non si usa l'identificatore di CLSID_WbemAdministrativeLocator nella chiamata CoCreateInstance , viene generato un errore di accesso negato.

    In circostanze consuete, WMI recapita eventi asincroni al client uno alla volta. Tuttavia, se un client non può ricevere notifiche di evento asincrone al momento dell'arrivo degli eventi, WMI avvia automaticamente l'invio in batch di eventi in una singola chiamata. L'invio in batch automatico è utile se i tempi di round trip sono un problema, come spesso accade in scenari con velocità effettiva elevata. Tuttavia, l'invio in batch non migliora le prestazioni del sistema se il client o la larghezza di banda di rete sono in errore.