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 管理提供事件接收器。

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)
Library Wbemuuid.lib
DLL Wbemsvc.dll

另请参阅

IWbemEventConsumerProvider

随时接收事件

在应用程序持续时间内接收事件