描述
FindConsumer函数定位并返回WMI可以发送事件的接收器对象。WMI将指针传递给逻辑消费者对象,然后FindConsumer定位与逻辑消费者相关联的物理消费者。最后,FindConsumer返回WMI一个指向属于物理消费者的汇点的指针。WMI在接收器上调用AddRef,并开始向sink发送适当的事件。WMI在可配置的时间段之后释放接收器,无需传送。如有必要,WMI可以再次呼叫FindConsumer来重新加载接收器。
C++ 语法
HRESULT FindConsumer( [in] IWbemClassObject *pLogicalConsumer, [out] IWbemUnboundObjectSink **ppConsumer ); |
PowerBASIC 语法
METHOD FindConsumer ( _ BYVAL pLogicalConsumer AS IWbemClassObject, _ BYREF ppConsumer AS IWbemUnboundObjectSink _ ) AS LONG |
参数
pLogicalConsumer
指向要传送事件对象的逻辑消费者对象的指针。
ppConsumer
将事件对象接收器返回给Windows Management。Windows管理员为此指针调用AddRef,并将与逻辑消费者相关联的事件传递到此接收器。最终,在适当的超时后,Windows Management会为该指针调用发布.
返回值
此方法返回一个HRESULT,指示方法调用的状态。下表列出了HRESULT中包含的值。
退货代码 |
描述 |
WBEM_E_FAILED |
提供程序在内部失败,它不能接受将来的请求。 |
WBEM_E_INVALID_PARAMETER |
一个或多个参数无效。 |
WBEM_E_NOT_FOUND |
提供者无法在内部定位或关联逻辑消费者,并且无法返回信宿。 |
WBEM_S_NO_ERROR |
提供商成功并将一个接收器返回给Windows Management。 |
示例代码
以下代码示例描述了FindConsumer的实现。在下面的实现中,假设有两个接收器用于接收事件,一个用于两个不同的已注册事件过滤器中的每一个。要确定哪个sink 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 Management以IWbemClassObject的形式向在模式中注册的逻辑消费者提供事件。当事件必须传递到逻辑消费者时,消费者提供商实现FindConsumer向Windows管理提供事件接收器。
Windows Management可识别逻辑消费者对象并使事件对象准备投放。要传送一个事件对象,WMI然后调用FindConsumer.消费者提供者必须创建一个事件接收器对象(指向IWbemUnboundObjectSink的指针),并返回指向Windows Management的指针,以便可以传递事件。
使用这种技术,单个事件消费者提供者可以通过返回不同的IWbemUnboundObjectSink指针来处理向许多不同逻辑消费者的事件传递。
您可以通过以下几种方式实施FindConsumer:
| · | 为所有逻辑消费者提供单个接收器。 |
这种方法在空间方面是最有效的,因为只有一个COM对象存储在内存中。例如,考虑事件消费者提供商为向消息文件记录消息的逻辑消费者提供汇点:单个接收方负责检查每个逻辑消费者所包含的数据并确定如何继续。很可能,收到的每个事件涉及打开日志文件,记录消息和关闭文件。虽然在空间方面效率高,但这一策略涉及到大量的处理时间。
| · | 为每个逻辑消费者提供不同的接收器。 |
这种方法通过使专用接收器准备好在事件发生时接收事件来优化性能。这种策略比单个接收器更快,但是由于其在存储器方面的成本,效率较低。因为每个接收器都维护自己的日志文件,所以当事件发生时,文件始终可以打开并准备好记录消息。当WMI在超时后释放接收器时,接收器可以关闭文件,从而在高速和低速传输方案中提供高效的性能。
| · | 将逻辑消费者划分成组,并为每个组提供不同的接收器。 |
这种方法在性能和效率之间有所损害。混合方法可能涉及到几个不同的日志文件,可能每个日志文件都绑定到要记录的消息类型。多个COM对象处理多个打开的文件。采用此方法的事件消费者提供者在FindConsumer调用期间读取日志文件名称,打开该文件,并返回将所有邮件记录到此文件中的接收器。提供者在上次调用发布方法时关闭文件。使用这种方法,消费者保留效率,因为它具有关于要使用哪个文件的信息;消费者不需要搜索或打开新文件。此外,消费者可以通过将将不同消息记录到同一文件的接收器来节省内存。
无论采用何种方法,您的实施应依赖于事件消费者提供者的存在。通话后指定的时间间隔后,WMI会释放事件消费者提供商。由于WMI需要您的事件消费者提供商仅为新的逻辑消费者提供指向汇的指针,所以在提供商为所有逻辑消费者提供服务后,WMI可以释放您的事件消费者提供商。然而,这些水槽必须保持接收所有发生的事件。
要求
客户 |
需要Windows Vista,Windows XP,Windows 2000 Professional,Windows NT Workstation 4.0 SP4及更高版本,Windows Me,Windows 98或Windows 95。 |
服务器 |
需要Windows Server 2008,Windows Server 2003,Windows 2000 Server或Windows NT Server 4.0 SP4及更高版本。 |
头 |
在Wbemprov.inc中声明。 |
DLL |
需要Wbemsvc.dll。 |


