Share via


IWbemEventConsumerProvider::FindConsumer-Methode (wbemprov.h)

Die FindConsumer-Funktion sucht und gibt Senkenobjekte zurück, an die WMI Ereignisse senden kann. WMI übergibt einen Zeiger auf ein logisches Consumerobjekt. FindConsumer sucht dann den physischen Consumer, der dem logischen Consumer zugeordnet ist. Schließlich gibt FindConsumer an WMI einen Zeiger auf die Senke zurück, die zum physischen Consumer gehört. WMI ruft AddRef für die Senke auf und beginnt, die entsprechenden Ereignisse an die Senke zu übermitteln. WMI gibt die Senke nach einem konfigurierbaren Zeitraum ohne Lieferungen frei. Bei Bedarf kann WMI FindConsumer erneut aufrufen, um die Senke erneut zu laden.

Syntax

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

Parameter

[in] pLogicalConsumer

Zeiger auf das logische Consumerobjekt, an das die Ereignisobjekte übermittelt werden sollen.

[out] ppConsumer

Gibt eine Ereignisobjektsenke an die Windows-Verwaltung zurück. Die Windows-Verwaltung ruft AddRef für diesen Zeiger auf und übermittelt die Ereignisse, die dem logischen Consumer zugeordnet sind, an diese Senke. Nach einem geeigneten Timeout ruft die Windows-Verwaltung schließlich Release für den Zeiger auf.

Rückgabewert

Diese Methode gibt ein HRESULT zurück, das den Status des Methodenaufrufs angibt. In der folgenden Liste ist der in einem HRESULT enthaltene Wert aufgeführt.

Hinweise

Die Windows-Verwaltung übermittelt Ereignisse in Form von IWbemClassObject an logische Consumer, die innerhalb des Schemas registriert sind. Ein Consumeranbieter implementiert FindConsumer , um eine Ereignissenke für die Windows-Verwaltung bereitzustellen, wenn Ereignisse an den logischen Consumer übermittelt werden müssen.

Die Windows-Verwaltung erkennt das logische Consumerobjekt und stellt die Ereignisobjekte bereit für die Übermittlung. Um ein Ereignisobjekt zu übermitteln, ruft WMI dann FindConsumer auf. Der Consumeranbieter muss ein Ereignissenkenobjekt (einen Zeiger auf IWbemUnboundObjectSink) erstellen und den Zeiger auf die Windows-Verwaltung zurückgeben, damit die Ereignisse übermittelt werden können.

Mit dieser Technik kann ein einzelner Ereignisconsumeranbieter die Übermittlung von Ereignissen an viele verschiedene logische Consumer verarbeiten, indem er jeweils unterschiedliche IWbemUnboundObjectSink-Zeiger zurückgibt.

Sie können FindConsumer auf verschiedene Arten implementieren:

  • Stellen Sie eine einzelne Senke für alle logischen Consumer bereit.

    Dieser Ansatz ist hinsichtlich des Speicherplatzes am effizientesten, da nur ein COM-Objekt im Arbeitsspeicher gespeichert wird. Nehmen wir beispielsweise einen Ereignisconsumeranbieter, der Senken für logische Consumer bereitstellt, die Nachrichten in Dateien protokollieren: Die einzelne Senke trägt die Verantwortung für die Untersuchung der daten, die in jedem logischen Consumer enthalten sind, und bestimmt, wie weiter verfahren werden soll. Höchstwahrscheinlich umfasst jedes empfangene Ereignis das Öffnen einer Protokolldatei, das Protokollieren der Nachricht und das Schließen der Datei. Diese Strategie ist zwar räumlich effizient, erfordert aber einen erheblichen Anteil an Verarbeitungszeit.

  • Stellen Sie für jeden logischen Consumer eine andere Senke bereit.

    Dieser Ansatz optimiert die Leistung, indem eine dedizierte Senke bereit ist, um ein Ereignis zu empfangen, wenn das Ereignis eintritt. Diese Strategie ist schneller als eine einzelne Senke, aber aufgrund der Kosten für den Arbeitsspeicher weniger effizient. Da jede Senke eine eigene Protokolldatei verwaltet, kann die Datei immer geöffnet sein und bereit sein, Meldungen zu protokollieren, wenn Ereignisse auftreten. Die Senke kann die Datei dann schließen, wenn WMI die Senke nach einem Timeout freigibt, und bietet effiziente Leistung sowohl in Hochgeschwindigkeits- als auch in Low-Speed-Übermittlungsszenarien.

  • Teilen Sie logische Consumer in Gruppen auf, und stellen Sie für jede Gruppe eine andere Senke bereit.

    Dieser Ansatz beeinträchtigt Leistung und Effizienz. Der Hybridansatz kann die Verwendung einiger unterschiedlicher Protokolldateien umfassen, wobei jede möglicherweise an den Typ der zu protokollierenden Nachricht gebunden ist. Mehrere COM-Objekte verarbeiten mehrere geöffnete Dateien. Ein Ereignisconsumeranbieter, der diesen Ansatz verfolgt, liest den Namen der Protokolldatei während des FindConsumer-Aufrufs , öffnet die Datei und gibt die Senke zurück, die alle Nachrichten in dieser Datei protokolliert. Der Anbieter schließt die Datei beim letzten Aufruf der Release-Methode . Mit diesem Ansatz behält der Verbraucher die Effizienz bei, da er über Informationen darüber verfügt, welche Datei genau verwendet werden soll; Der Consumer muss keine neue Datei suchen oder öffnen. Außerdem kann der Consumer Arbeitsspeicher sparen, indem er Senken kombiniert, die verschiedene Nachrichten in derselben Datei protokollieren.

Unabhängig vom Ansatz sollte Ihre Implementierung von der Existenz eines Ereignisconsumeranbieters abhängen. WMI gibt einen Ereignisconsumeranbieter frei, nachdem ein festgelegtes Intervall zwischen Aufrufen abgelaufen ist. Da WMI Ihren Ereignisconsumeranbieter nur benötigt, um Zeiger auf Senken für neue logische Consumer bereitzustellen, kann WMI Ihren Ereignisconsumeranbieter freigeben, nachdem Ihr Anbieter alle betreffenden logischen Consumer bezieht. Die Senken müssen jedoch bleiben, um alle auftretenden Ereignisse zu empfangen.

Beispiele

Im folgenden Codebeispiel wird eine Implementierung von FindConsumer beschrieben. In der folgenden Implementierung wird davon ausgegangen, dass zwei Senken für den Empfang von Ereignissen vorhanden sind, eine für jeden der beiden unterschiedlichen registrierten Ereignisfilter. Um zu bestimmen, welche Senke FindConsumer zurück an WMI sendet, untersucht der Code das eingehende logische Consumerobjekt.

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;
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista
Unterstützte Mindestversion (Server) Windows Server 2008
Zielplattform Windows
Kopfzeile wbemprov.h (include Wbemidl.h)
Bibliothek Wbemuuid.lib
DLL Wbemsvc.dll

Weitere Informationen

IWbemEventConsumerProvider

Empfang von Ereignissen zu jeder Zeit

Empfangen von Ereignissen für die Dauer Ihrer Anwendung