Antarmuka IWbemObjectSink
Antarmuka IWbemObjectSink membuat antarmuka sink yang dapat menerima semua jenis pemberitahuan dalam model pemrograman WMI. Klien harus menerapkan antarmuka ini untuk menerima hasil metode asinkronIWbemServices, dan jenis pemberitahuan peristiwa tertentu. Penyedia menggunakan, tetapi tidak mengimplementasikan antarmuka ini untuk menyediakan peristiwa dan objek ke WMI.
Biasanya, penyedia memanggil implementasi yang diberikan kepada mereka oleh WMI. Dalam kasus ini, panggil Tunjukkan untuk menyediakan objek ke layanan WMI. Setelah itu, panggil SetStatus untuk menunjukkan akhir urutan pemberitahuan. Anda juga dapat memanggil SetStatus untuk menunjukkan kesalahan saat sink tidak memiliki objek apa pun.
Saat memprogram klien asinkron WMI, pengguna menyediakan implementasi. WMI memanggil metode untuk mengirimkan objek dan mengatur status hasilnya.
Catatan
Jika aplikasi klien melewati antarmuka sink yang sama dalam dua panggilan asinkron yang tumpang tindih yang berbeda, WMI tidak menjamin urutan panggilan balik. Aplikasi klien yang melakukan panggilan asinkron yang tumpang tindih harus melewati objek sink yang berbeda, atau menserialisasikan panggilan mereka.
Catatan
Karena panggilan balik ke sink mungkin tidak dikembalikan pada tingkat autentikasi yang sama dengan yang diperlukan klien, disarankan agar Anda menggunakan semisinkron alih-alih komunikasi asinkron. Untuk informasi selengkapnya, lihat Memanggil Metode.
Anggota
Antarmuka IWbemObjectSink memiliki jenis anggota ini:
Metode
Antarmuka IWbemObjectSink memiliki metode ini.
Metode | Deskripsi |
---|---|
Tunjukkan | Menerima objek pemberitahuan. |
SetStatus | Dipanggil oleh sumber untuk menunjukkan akhir urutan pemberitahuan, atau untuk mengirim kode status lain ke sink. |
Keterangan
Saat menerapkan sink langganan peristiwa (IWbemObjectSink atau IWbemEventSink), jangan memanggil WMI dari dalam metode Menunjukkan atau SetStatus pada objek sink. Misalnya, memanggil IWbemServices::CancelAsyncCall untuk membatalkan sink dari dalam implementasi Menunjukkan dapat mengganggu status WMI. Untuk membatalkan langganan acara, atur bendera dan panggil IWbemServices::CancelAsyncCall dari utas atau objek lain. Untuk implementasi yang tidak terkait dengan sink peristiwa, seperti pengambilan objek, enum, dan kueri, Anda dapat memanggil kembali ke WMI.
Implementasi sink harus memproses pemberitahuan peristiwa dalam 100 MSEC karena utas WMI yang mengirimkan pemberitahuan peristiwa tidak dapat melakukan pekerjaan lain sampai objek sink selesai diproses. Jika pemberitahuan memerlukan pemrosesan dalam jumlah besar, sink dapat menggunakan antrean internal untuk utas lain untuk menangani pemrosesan.
Contoh
Contoh kode berikut adalah implementasi sederhana dari sink objek. Sampel ini dapat digunakan dengan IWbemServices::ExecQueryAsync atau IWbemServices::CreateInstanceEnumAsync untuk menerima instans yang dikembalikan:
#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;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung |
Windows Vista |
Server minimum yang didukung |
Windows Server 2008 |
Header |
|
Pustaka |
|
DLL |
|