IWbemObjectSink接口创建一个接收器接口,可以接收WMI编程模型中的所有类型的通知。客户端必须实现此接口以接收IWbemServices的异步方法的结果以及特定类型的事件通知。提供者使用,但不实现此接口向WMI提供事件和对象。
通常,提供商称之为WMI提供给它们的实现。在这些情况下,调用指示将对象提供给WMI服务。之后,调用SetStatus以指示通知序列的结束。当接收器没有任何对象时,也可以调用SetStatus来指示错误。
当编程WMI的异步客户端时,用户提供实现。WMI调用传递对象的方法并设置结果的状态。
注意如果客户端应用程序在两个不同的重叠异步调用中通过相同的接收器接口,则WMI不保证回调的顺序。使重叠的异步调用的客户端应用程序应该传递不同的接收器对象,或者将其调用序列化。
注意因为在客户端需要相同的身份验证级别可能不返回到宿的回调,所以建议您使用半异步而不是异步通信。
方法
IWbemObjectSink界面定义了以下方法。
方法 |
描述 |
表明 |
接收通知对象。 |
SetStatus |
收到通知状态。 |
备注
当实现事件订阅接收器(IWbemObjectSink或IWbemEventSink)时,不要从接收器对象的表明或SetStatus方法调用WMI。例如,从指示的实现中调用IWbemServices.CancelAsyncCall取消接收器可能会干扰WMI状态。要取消事件订阅,请设置一个标志,并从另一个线程或对象调用IWbemServices.CancelAsyncCall.对于与事件接收器无关的实现(如对象,枚举和查询检索),可以回调到WMI。
Sink实现应该在100 MSEC内处理事件通知,因为传递事件通知的WMI线程在宿对象完成处理之前无法执行其他工作。如果通知需要大量处理,则宿可以使用另一个线程的内部队列来处理该处理。
示例代码[C++]
以下代码示例是对象接收器的简单实现。此示例可与IWbemServices.ExecQueryAsync或IWbemServices.CreateInstanceEnumAsync一起使用以接收返回的实例:
#include <iostream>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
class QuerySink : public IWbemObjectSink
{
LONG m_lRef;
bool bDone;
public:
QuerySink() { m_lRef = 0; }
~QuerySink() { bDone = TRUE; }
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE
QueryInterface(REFIID riid, void** ppv);
virtual HRESULT STDMETHODCALLTYPE Indicate(
/* [in] */
LONG lObjectCount,
/* [size_is][in] */
IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray
);
virtual HRESULT STDMETHODCALLTYPE SetStatus(
/* [in] */ LONG lFlags,
/* [in] */ HRESULT hResult,
/* [in] */ BSTR strParam,
/* [in] */ IWbemClassObject __RPC_FAR *pObjParam
);
};
ULONG QuerySink::AddRef()
{
return InterlockedIncrement(&m_lRef);
}
ULONG QuerySink::Release()
{
LONG lRef = InterlockedDecrement(&m_lRef);
if(lRef == 0)
delete this;
return lRef;
}
HRESULT QuerySink::QueryInterface(REFIID riid, void** ppv)
{
if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
{
*ppv = (IWbemObjectSink *) this;
AddRef();
return WBEM_S_NO_ERROR;
}
else return E_NOINTERFACE;
}
HRESULT QuerySink::Indicate(long lObjCount, IWbemClassObject **pArray)
{
for (long i = 0; i < lObjCount; i++)
{
IWbemClassObject *pObj = pArray[i];
// ... use the object.
// AddRef() is only required if the object will be held after
// the return to the caller.
}
return WBEM_S_NO_ERROR;
}
HRESULT QuerySink::SetStatus(
/* [in] */ LONG lFlags,
/* [in] */ HRESULT hResult,
/* [in] */ BSTR strParam,
/* [in] */ IWbemClassObject __RPC_FAR *pObjParam
)
{
printf("QuerySink::SetStatus hResult = 0x%X\n", hResult);
return WBEM_S_NO_ERROR;
}
要求
客户 |
需要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及更高版本。 |
头 |
在Wbemcli.inc中声明。 |
DLL |
需要Fastprox.dll。 |