IWbemEventConsumerProvider::FindConsumer 方法 (wbemprov.h)

FindConsumer 函式會尋找並傳回 WMI 可以傳送事件的接收物件。 WMI 會將指標傳遞至邏輯取用者對象,然後 FindConsumer 會找出與邏輯取用者相關聯的實體取用者。 最後, FindConsumer 會 傳回屬於實體取用者之接收的指標給 WMI。 WMI 會在接收上呼叫 AddRef ,並開始將適當的事件傳遞給接收。 WMI 在一段可設定的期間內沒有傳遞之後釋放接收。 如有必要,WMI 可以再次呼叫 FindConsumer ,以再次載入接收。

語法

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

參數

[in] pLogicalConsumer

要傳遞事件物件之邏輯取用者物件的指標。

[out] ppConsumer

將事件物件接收傳回至 Windows 管理。 Windows 管理會呼叫這個指標的 AddRef ,並將與邏輯取用者相關聯的事件傳遞至此接收。 最後,在適當的逾時之後,Windows 管理會針對指標呼叫 Release

傳回值

這個方法會傳回 HRESULT ,指出方法呼叫的狀態。 下列清單列出 HRESULT 中包含的值。

備註

Windows 管理會將 IWbemClassObject 形式的事件傳遞給在架構內註冊的邏輯取用者。 取用者提供者會實作 FindConsumer ,以在必須傳遞事件給邏輯取用者時,將事件接收提供給 Windows Management。

Windows 管理可辨識邏輯取用者物件,並讓事件對象準備好傳遞。 若要傳遞事件物件,WMI 接著會呼叫 FindConsumer。 取用者提供者必須建立事件接收物件, (IWbemUnboundObjectSink) 的指標,並傳回指向 Windows 管理的指標,以便傳遞事件。

使用這項技術時,單一事件取用者提供者可以傳回每個事件的不同 IWbemUnboundObjectSink 指標,來處理將事件傳遞至許多不同的邏輯取用者。

您可以透過數種方式 實作 FindConsumer

  • 為所有邏輯取用者提供單一接收。

    這種方法在空間方面最有效率,因為只有一個 COM 物件儲存在記憶體中。 例如,假設事件取用者提供者為記錄訊息給檔案的邏輯取用者提供接收:單一接收負責檢查每個邏輯取用者所包含的數據,並判斷如何繼續。 最可能收到的每個事件都牽涉到開啟記錄檔、記錄訊息,以及關閉檔案。 雖然在空間方面有效率,但此策略牽涉到大量的處理時間。

  • 為每個邏輯取用者提供不同的接收。

    此方法可讓專用接收準備好在事件發生時接收事件,藉此優化效能。 此策略比單一接收更快,但因為記憶體的成本較低。 由於每個接收都會維護自己的記錄檔,因此檔案一律可以開啟並準備好在事件發生時記錄訊息。 當 WMI 在逾時後釋放接收時,接收就可以關閉檔案,在高速和低速傳遞案例中提供有效率的效能。

  • 將邏輯取用者分成群組,併為每個群組提供不同的接收。

    這種方法會危害效能和效率。 混合式方法可能牽涉到有一些不同的記錄檔,可能每個記錄檔都系結至要記錄的訊息類型。 多個 COM 物件會處理多個開啟的檔案。 採用此方法的事件取用者提供者會在 FindConsumer 呼叫期間讀取記錄檔名稱、開啟檔案,並傳回將所有訊息記錄到此檔案的接收。 提供者會在最後一次呼叫 Release 方法時關閉檔案。 使用此方法時,取用者會保留效率,因為它有確切使用哪個檔案的資訊;不需要取用者即可搜尋或開啟新的檔案。 此外,取用者可以將記錄不同訊息的接收結合至同一個檔案,以節省記憶體。

不論使用何種方法,您的實作都應該取決於事件取用者提供者的存在。 WMI 會在呼叫之間經過指定的間隔之後釋放事件取用者提供者。 因為 WMI 需要事件取用者提供者,才能為新的邏輯取用者提供接收的指標,所以 WMI 可以在提供者服務所有有問題的邏輯取用者之後釋放事件取用者提供者。 不過,接收必須保留,才能接收所有發生的事件。

範例

下列程式代碼範例描述 FindConsumer 的實作。 在下列實作中,假設有兩個接收用於接收事件,其中一個用於兩個不同的已註冊事件篩選條件。 為了判斷哪個 接收 FindConsumer 傳回 WMI,程式代碼會檢查傳入的邏輯取用者物件。

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

規格需求

需求
最低支援的用戶端 Windows Vista
最低支援的伺服器 Windows Server 2008
目標平台 Windows
標頭 wbemprov.h (包含 Wbemidl.h)
程式庫 Wbemuuid.lib
Dll Wbemsvc.dll

另請參閱

IWbemEventConsumerProvider

隨時接收事件

在應用程式持續期間接收事件