IWbemObjectSink 介面
IWbemObjectSink介面會建立接收介面,以接收 WMI 程式設計模型中所有類型的通知。 用戶端必須實作這個介面,才能接收IWbemServices非同步方法的結果,以及特定類型的事件通知。 提供者會使用 ,但不會實作此介面,以提供事件和物件給 WMI。
一般而言,提供者會呼叫 WMI 提供給它們的實作。 在這些情況下,呼叫 Indicate 將物件提供給 WMI 服務。 之後,呼叫 SetStatus 以指出通知序列的結尾。 您也可以呼叫 SetStatus ,以指出接收沒有任何物件時的錯誤。
對 WMI 的非同步用戶端進行程式設計時,使用者會提供實作。 WMI 會呼叫 方法來傳遞物件,並設定結果的狀態。
注意
如果用戶端應用程式在兩個不同的重迭非同步呼叫中傳遞相同的接收介面,WMI 不保證回呼的順序。 進行重迭非同步呼叫的用戶端應用程式應該傳遞不同的接收物件,或序列化其呼叫。
注意
由於回呼接收可能不會與用戶端所需的相同驗證層級傳回,因此建議您使用半同步處理而非非同步通訊。 如需詳細資訊,請參閱 呼叫方法。
成員
IWbemObjectSink介面具有下列類型的成員:
方法
IWbemObjectSink介面具有這些方法。
方法 | 描述 |
---|---|
表明 | 接收通知物件。 |
SetStatus | 由來源呼叫以指出通知序列的結尾,或將其他狀態碼傳送至接收。 |
備註
實作事件訂閱接收 (IWbemObjectSink 或 IWbemEventSink) 時,請勿從接收物件的 Indicate 或 SetStatus 方法內呼叫 WMI。 例如,呼叫 IWbemServices::CancelAsyncCall 以取消 來自 Indicate 實作內的接收可能會干擾 WMI 狀態。 若要取消事件訂閱,請設定旗標,並從另一個執行緒或物件呼叫 IWbemServices::CancelAsyncCall 。 對於與事件接收無關的實作,例如物件、列舉和查詢擷取,您可以回呼 WMI。
接收實作應該會在 100 MSEC 內處理事件通知,因為傳遞事件通知的 WMI 執行緒無法在接收物件完成處理之前執行其他工作。 如果通知需要大量處理,接收可以使用內部佇列處理另一個執行緒來處理處理。
範例
下列程式碼範例是物件接收的簡單實作。 此範例可與 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 Server 2008 |
標頭 |
|
程式庫 |
|
DLL |
|