Bagikan melalui


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
Wbemcli.h (termasuk Wbemidl.h)
Pustaka
Wbemuuid.lib
DLL
Fastprox.dll

Lihat juga

COM API untuk WMI

Melakukan Panggilan Asinkron dengan C++

Mengatur Keamanan pada Panggilan Asinkron

Menerima Peristiwa selama Durasi Aplikasi Anda