Metodo IWbemEventConsumerProvider::FindConsumer (wbemprov.h)

La funzione FindConsumer individua e restituisce oggetti sink a cui WMI può inviare eventi. WMI passa un puntatore a un oggetto consumer logico, quindi FindConsumer individua il consumer fisico associato al consumer logico. Infine, FindConsumer restituisce a WMI un puntatore al sink appartenente al consumer fisico. WMI chiama AddRef nel sink e inizia a recapitare gli eventi appropriati al sink. WMI rilascia il sink dopo un periodo di tempo configurabile senza consegna. Se necessario, WMI può chiamare di nuovo FindConsumer per caricare di nuovo il sink.

Sintassi

HRESULT FindConsumer(
  [in]  IWbemClassObject       *pLogicalConsumer,
  [out] IWbemUnboundObjectSink **ppConsumer
);

Parametri

[in] pLogicalConsumer

Puntatore all'oggetto consumer logico a cui devono essere recapitati gli oggetti evento.

[out] ppConsumer

Restituisce un sink di oggetti evento in Gestione windows. Gestione windows chiama AddRef per questo puntatore e recapita gli eventi associati al consumer logico a questo sink. Alla fine, dopo un timeout appropriato, Gestione Windows chiama Release per il puntatore.

Valore restituito

Questo metodo restituisce un HRESULT che indica lo stato della chiamata al metodo. L'elenco seguente elenca il valore contenuto in un HRESULT.

Commenti

Gestione windows offre eventi sotto forma di IWbemClassObject ai consumer logici registrati all'interno dello schema. Un provider consumer implementa FindConsumer per fornire un sink di eventi a Gestione di Windows ogni volta che gli eventi devono essere recapitati al consumer logico.

Gestione windows riconosce l'oggetto consumer logico e dispone degli oggetti evento pronti per il recapito. Per recapitare un oggetto evento, WMI chiama quindi FindConsumer. Il provider consumer deve creare un oggetto sink di eventi (un puntatore a IWbemUnboundObjectSink) e restituire il puntatore a Gestione windows in modo che gli eventi possano essere recapitati.

Usando questa tecnica, un singolo provider di consumer di eventi può gestire la distribuzione di eventi a molti consumer logici diversi restituendo puntatori IWbemUnboundObjectSink per ognuno.

È possibile implementare FindConsumer in diversi modi:

  • Fornire un singolo sink per tutti i consumer logici.

    Questo approccio è il più efficiente in termini di spazio perché solo un oggetto COM viene archiviato in memoria. Si consideri, ad esempio, un provider consumer di eventi che fornisce sink per i consumer logici che registrano i messaggi ai file: il singolo sink deve esaminare i dati inclusi in ogni consumer logico e determinare come procedere. È probabile che ogni evento ricevuto comporti l'apertura di un file di log, la registrazione del messaggio e la chiusura del file. Sebbene sia efficiente in termini di spazio, questa strategia implica una notevole quantità di tempo di elaborazione.

  • Fornire un sink diverso per ogni consumer logico.

    Questo approccio ottimizza le prestazioni con un sink dedicato pronto per ricevere un evento quando si verifica l'evento. Questa strategia è più veloce di un singolo sink, ma meno efficiente a causa del suo costo in termini di memoria. Poiché ogni sink gestisce il proprio file di log, il file può sempre essere aperto e pronto per registrare i messaggi quando si verificano eventi. Il sink può quindi chiudere il file quando WMI rilascia il sink dopo un timeout, fornendo prestazioni efficienti sia in scenari di recapito ad alta velocità che in scenari di recapito a bassa velocità.

  • Dividere i consumer logici in gruppi e fornire un sink diverso per ogni gruppo.

    Questo approccio compromette le prestazioni e l'efficienza. L'approccio ibrido può comportare la registrazione di alcuni file di log diversi, eventualmente con ognuno associato al tipo di messaggio da registrare. Più oggetti COM gestiscono più file aperti. Un provider consumer di eventi che accetta questo approccio legge il nome del file di log durante la chiamata FindConsumer , apre il file e restituisce il sink che registra tutti i messaggi in questo file. Il provider chiude il file nell'ultima chiamata al metodo Release . Con questo approccio, il consumatore mantiene l'efficienza perché ha informazioni su esattamente quale file usare; il consumer non è necessario per cercare o aprire un nuovo file. Inoltre, il consumer può risparmiare memoria combinando sink che registrano messaggi diversi nello stesso file.

Indipendentemente dall'approccio, l'implementazione deve dipendere dall'esistenza di un provider di consumer di eventi. WMI rilascia un provider consumer di eventi dopo che un intervallo designato è trascorso tra le chiamate. Poiché WMI necessita del provider di consumer eventi solo per fornire puntatori ai sink per nuovi consumer logici, WMI può rilasciare il provider di consumer eventi dopo che tutti i consumer logici in questione sono tutti i servizi del provider. I sink, tuttavia, devono rimanere per ricevere tutti gli eventi che si verificano.

Esempio

Nell'esempio di codice seguente viene descritta un'implementazione di FindConsumer. Nell'implementazione seguente si presuppone che esistano due sink per la ricezione di eventi, uno per ognuno dei due filtri eventi registrati diversi. Per determinare quale sink FindConsumer invia a WMI, il codice esamina l'oggetto consumer logico in ingresso.

HRESULT MyEventConsumerClass::FindConsumer(
   /* [in] */ IWbemClassObject __RPC_FAR *pLogicalConsumer,
   /* [out] */ IWbemUnboundObjectSink __RPC_FAR *__RPC_FAR *ppConsumer
   )
{
   // Examine the logical consumer to see which one it is.
   // ====================================================

   VARIANT v;    
   VariantInit(&v);

   HRESULT hRes = WBEM_E_NOT_FOUND;
   *ppConsumer = 0;

   pLogicalConsumer->Get(_bstr_t(L"Name"), 0, &v, 0, 0);

   // Decide which of the two logical consumers to send back.
   // =======================================================

   if (_wcsicmp(V_BSTR(&v), L"Consumer1") == 0)
   {

    //send back the Consumer1 sink to WMI
    // For example:
      /*hRes =  m_pConsumer1->
         QueryInterface(IID_IWbemUnboundObjectSink,
                           (LPVOID*)ppConsumer);*/
   }
   else if (_wcsicmp(V_BSTR(&v), L"Consumer2") == 0)
   {
    //send back the Consumer2 sink to WMI
    // For example:
      /*hRes =  m_pConsumer2->
          QueryInterface(IID_IWbemUnboundObjectSink,
                            (LPVOID*)ppConsumer);*/
   }

   VariantClear(&v);
   return hRes;
}

Requisiti

Requisito Valore
Client minimo supportato Windows Vista
Server minimo supportato Windows Server 2008
Piattaforma di destinazione Windows
Intestazione wbemprov.h (include Wbemidl.h)
Libreria Wbemuuid.lib
DLL Wbemsvc.dll

Vedi anche

IWbemEventConsumerProvider

Ricezione di eventi in tutti i tempi

Ricezione di eventi per la durata dell'applicazione