IWbemObjectSink 介面 (wbemcli.h)

IWbemObjectSink 介面會建立接收介面,以接收 WMI 程式設計模型中所有類型的通知。 用戶端必須實作這個介面,才能接收 IWbemServices異步方法的結果,以及特定類型的事件通知。 提供者會使用 ,但不會實作此介面,以提供事件和物件給WMI。

一般而言,提供者會呼叫 WMI 提供給它們的實作。 在這些情況下,呼叫 Indicate 將物件提供給 WMI 服務。 之後,呼叫 SetStatus 以指出通知序列的結尾。 您也可以呼叫 SetStatus ,以指出接收沒有任何物件時的錯誤。

對WMI的異步用戶端進行程序設計時,使用者會提供實作。 WMI 會呼叫 方法來傳遞物件,並設定結果的狀態。

注意 如果用戶端應用程式在兩個不同的重疊異步呼叫中傳遞相同的接收介面,WMI 不保證回呼的順序。 進行重疊異步呼叫的用戶端應用程式應該傳遞不同的接收物件,或串行化其呼叫。
 
注意 由於回呼接收可能不會與用戶端所需的相同驗證層級傳回,因此建議您使用半同步處理而非異步通訊。 如需詳細資訊,請參閱 呼叫方法
 

繼承

IWbemObjectSink 介面繼承自 IUnknown 介面。 IWbemObjectSink 也有下列類型的成員:

方法

IWbemObjectSink 介面具有這些方法。

 
IWbemObjectSink::Indicate

由來源呼叫以提供通知。
IWbemObjectSink::SetStatus

由來源呼叫以指出通知序列的結尾,或將其他狀態代碼傳送至接收。

備註

實作事件訂閱接收 (IWbemObjectSinkIWbemEventSink) 時,請勿從接收物件的 IndicateSetStatus 方法內呼叫 WMI。 例如,呼叫 IWbemServices::CancelAsyncCall 以取消 來自 Indicate 實作內的接收可能會干擾 WMI 狀態。 若要取消事件訂閱,請設定旗標,並從另一個線程或物件呼叫 IWbemServices::CancelAsyncCall 。 對於與事件接收無關的實作,例如物件、列舉和查詢擷取,您可以回呼 WMI。

接收實作應該會在 100 MSEC 內處理事件通知,因為傳遞事件通知的 WMI 線程無法在接收物件完成處理之前執行其他工作。 如果通知需要大量處理,接收可以使用內部佇列處理另一個線程來處理處理。

範例

下列程式代碼範例是物件接收的簡單實作。 此範例可與 IWbemServices::ExecQueryAsyncIWbemServices::CreateInstanceEnumAsync 搭配使用,以接收傳回的實例:

C++
#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
目標平台 Windows
標頭 wbemcli.h (包含 Wbemidl.h)

另請參閱

適用於 WMI 的 COM API

使用 C++ 進行異步呼叫

在應用程式的持續時間內接收事件

在異步呼叫上設定安全性