IWbemObjectSink 接口

IWbemObjectSink 接口创建接收器接口,该接口可接收 WMI 编程模型中的所有类型的通知。 客户端必须实现此接口以接收 IWbemServices异步方法的结果和特定类型的事件通知。 提供程序使用,但不实现此接口来向 WMI 提供事件和对象。

通常,提供程序调用由 WMI 提供给它们的实现。 在这些情况下,调用 表示 向 WMI 服务提供对象。 然后,调用 SetStatus 来指示通知序列的结束。 如果接收器没有任何对象,还可以调用 SetStatus 来指示错误。

在对 WMI 的异步客户端进行编程时,用户提供了实现。 WMI 调用方法传递对象并设置结果的状态。

备注

如果客户端应用程序在两个不同的重叠异步调用中传递相同的接收器接口,则 WMI 不保证回调的顺序。 执行重叠异步调用的客户端应用程序应传递不同的接收器对象或序列化它们的调用。

备注

由于在客户端要求回拨到接收器的身份验证级别上可能未返回,因此建议使用半同步,而不是异步通信。 有关详细信息,请参阅 调用方法

成员

IWbemObjectSink 接口具有以下类型的成员:

方法

IWbemObjectSink 接口具有这些方法。

方法 描述
意味 接收通知对象。
SetStatus 由源调用以指示通知序列的结束,或向接收器发送其他状态代码。

备注

(IWbemObjectSinkIWbemEventSink) 实现事件订阅接收器时,请不要从接收器对象上的 指示SetStatus 方法中调用 WMI。 例如,调用 IWbemServices:: CancelAsyncCall 可从 指示 的实现中取消接收器,这可能会影响 WMI 状态。 若要取消事件订阅,请设置标志并从其他线程或对象调用 IWbemServices:: CancelAsyncCall 。 对于与事件接收器无关的实现(如对象、枚举和查询检索),可以回调到 WMI。

接收器实现应在100毫秒内处理事件通知,因为传递事件通知的 WMI 线程在接收器对象处理完成之前不能执行其他操作。 如果通知需要大量处理,则接收器可以为另一个线程使用内部队列来处理处理。

示例

下面的代码示例是对象接收器的简单实现。 此示例可用于 IWbemServices:: ExecQueryAsyncIwbemservices:: 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 Server 2008
标头
Wbemcli (包含 Wbemidl)

Wbemuuid
DLL
Fastprox.dll

另请参阅

用于 WMI 的 COM API

使用 c + + 进行异步调用

设置异步调用的安全性

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