Bagikan melalui


Antarmuka IWbemObjectSink (wbemcli.h)

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.
 

Warisan

Antarmuka IWbemObjectSink mewarisi dari antarmuka IUnknown . IWbemObjectSink juga memiliki jenis anggota berikut:

Metode

Antarmuka IWbemObjectSink memiliki metode ini.

 
IWbemObjectSink::Menunjukkan

Dipanggil oleh sumber untuk memberikan pemberitahuan.
IWbemObjectSink::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:

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;
}

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista
Server minimum yang didukung Windows Server 2008
Target Platform Windows
Header wbemcli.h (termasuk Wbemidl.h)

Lihat juga

COM API untuk WMI

Melakukan Panggilan Asinkron dengan C++

Menerima Peristiwa selama Durasi Aplikasi Anda

Mengatur Keamanan pada Panggilan Asinkron