IWbemObjectSink 介面

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

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

在撰寫 WMI 的非同步用戶端程式設計時,使用者會提供 實作。 WMI 會呼叫 方法來傳遞物件,並設定結果的狀態。

注意

如果用戶端應用程式在兩個不同的重迭非同步呼叫中傳遞相同的接收介面,WMI 不保證回呼的順序。 進行重迭非同步呼叫的用戶端應用程式應該傳遞不同的接收物件,或序列化其呼叫。

注意

由於對接收的回呼可能不會在用戶端所需的相同驗證層級傳回,因此建議您使用半同步而非非同步通訊。 如需詳細資訊,請參閱 呼叫方法

成員

IWbemObjectSink介面具有下列類型的成員:

方法

IWbemObjectSink介面具有這些方法。

方法 描述
表明 接收通知物件。
SetStatus 由來源呼叫以指出通知序列的結尾,或將其他狀態碼傳送至接收。

備註

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

接收實作應該在 100 MSEC 內處理事件通知,因為傳遞事件通知的 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.h (包含 Wbemidl.h)
程式庫
Wbemuuid.lib
DLL
Fastprox.dll

另請參閱

適用于 WMI 的 COM API

使用 C++ 進行非同步呼叫

在非同步呼叫上設定安全性

在應用程式持續期間接收事件