IWbemEventConsumerProvider::FindConsumer method (wbemprov.h)

Fungsi FindConsumer menemukan dan mengembalikan objek sink tempat WMI dapat mengirim peristiwa. WMI meneruskan pointer ke objek konsumen logis, lalu FindConsumer menemukan konsumen fisik yang terkait dengan konsumen logis. Akhirnya, FindConsumer kembali ke WMI penunjuk ke sink milik konsumen fisik. WMI memanggil AddRef di sink dan mulai mengirimkan peristiwa yang sesuai ke sink. WMI merilis sink setelah jangka waktu yang dapat dikonfigurasi tanpa pengiriman. Jika perlu, WMI dapat memanggil FindConsumer lagi untuk memuat sink lagi.

Sintaks

HRESULT FindConsumer(
  [in]  IWbemClassObject       *pLogicalConsumer,
  [out] IWbemUnboundObjectSink **ppConsumer
);

Parameter

[in] pLogicalConsumer

Arahkan ke objek konsumen logis tempat objek peristiwa akan dikirimkan.

[out] ppConsumer

Mengembalikan sink objek peristiwa ke Manajemen Windows. Manajemen Windows memanggil AddRef untuk pointer ini dan mengirimkan peristiwa yang terkait dengan konsumen logis ke sink ini. Akhirnya, setelah batas waktu yang sesuai, Manajemen Windows memanggil Rilis untuk penunjuk.

Nilai kembali

Metode ini mengembalikan HRESULT yang menunjukkan status panggilan metode. Daftar berikut mencantumkan nilai yang terkandung dalam HRESULT.

Keterangan

Manajemen Windows memberikan peristiwa dalam bentuk IWbemClassObject kepada konsumen logis yang terdaftar dalam skema. Penyedia konsumen mengimplementasikan FindConsumer untuk menyediakan sink peristiwa ke Manajemen Windows setiap kali peristiwa harus dikirimkan ke konsumen logis.

Manajemen Windows mengenali objek konsumen logis dan memiliki objek peristiwa yang siap untuk pengiriman. Untuk mengirimkan objek peristiwa, WMI kemudian memanggil FindConsumer. Penyedia konsumen harus membuat objek sink peristiwa (penunjuk ke IWbemUnboundObjectSink), dan mengembalikan penunjuk ke Manajemen Windows sehingga peristiwa dapat dikirimkan.

Dengan menggunakan teknik ini, penyedia konsumen peristiwa tunggal dapat menangani pengiriman peristiwa ke banyak konsumen logis yang berbeda dengan mengembalikan pointer IWbemUnboundObjectSink yang berbeda untuk masing-masing.

Anda dapat menerapkan FindConsumer dengan beberapa cara:

  • Menyediakan sink tunggal untuk semua konsumen logis.

    Pendekatan ini adalah yang paling efisien dalam hal ruang karena hanya satu objek COM yang disimpan dalam memori. Misalnya, pertimbangkan penyedia konsumen peristiwa yang menyediakan sink untuk konsumen logis yang mencatat pesan ke file: Sink tunggal bertanggung jawab untuk memeriksa data yang disertakan dengan setiap konsumen logis dan menentukan cara melanjutkan. Kemungkinan besar, setiap peristiwa yang diterima melibatkan pembukaan file log, mencatat pesan, dan menutup file. Meskipun efisien dalam hal ruang, strategi ini melibatkan sejumlah besar waktu pemrosesan.

  • Sediakan sink yang berbeda untuk setiap konsumen logis.

    Pendekatan ini mengoptimalkan performa dengan memiliki sink khusus yang siap menerima peristiwa saat peristiwa terjadi. Strategi ini lebih cepat daripada satu sink, tetapi kurang efisien karena biayanya dalam hal memori. Karena setiap sink mempertahankan file lognya sendiri, file selalu dapat terbuka dan siap untuk mencatat pesan saat peristiwa terjadi. Sink kemudian dapat menutup file ketika WMI merilis sink setelah waktu habis, memberikan performa yang efisien baik dalam skenario pengiriman berkecepatan tinggi maupun berkecepatan rendah.

  • Bagi konsumen logis menjadi beberapa grup dan berikan sink yang berbeda untuk setiap grup.

    Pendekatan ini mengorbankan antara performa dan efisiensi. Pendekatan hibrid dapat melibatkan memiliki beberapa file log yang berbeda, mungkin dengan masing-masing terkait dengan jenis pesan yang akan dicatat. Beberapa objek COM menangani beberapa file yang terbuka. Penyedia konsumen peristiwa yang mengambil pendekatan ini membaca nama file log selama panggilan FindConsumer , membuka file, dan mengembalikan sink yang mencatat semua pesan ke dalam file ini. Penyedia menutup file pada panggilan terakhir ke metode Rilis . Dengan pendekatan ini, konsumen mempertahankan efisiensi karena memiliki informasi tentang file mana yang akan digunakan; konsumen tidak diharuskan mencari atau membuka file baru. Selain itu, konsumen dapat menyimpan memori dengan menggabungkan sink yang mencatat pesan yang berbeda ke file yang sama.

Terlepas dari pendekatannya, implementasi Anda harus bergantung pada keberadaan penyedia konsumen peristiwa. WMI merilis penyedia konsumen peristiwa setelah interval yang ditunjuk berlalu di antara panggilan. Karena WMI membutuhkan penyedia konsumen peristiwa Anda hanya untuk menyediakan pointer ke sink untuk konsumen logis baru, WMI dapat merilis penyedia konsumen peristiwa Anda setelah layanan penyedia Anda semua konsumen logis yang dimaksud. Sink, bagaimanapun, harus tetap menerima semua peristiwa yang terjadi.

Contoh

Contoh kode berikut menjelaskan implementasi FindConsumer. Dalam implementasi berikut, asumsikan ada dua sink untuk menerima peristiwa, satu untuk masing-masing dari dua filter peristiwa terdaftar yang berbeda. Untuk menentukan sink FindConsumer mana yang dikirim kembali ke WMI, kode memeriksa objek konsumen logis yang masuk.

HRESULT MyEventConsumerClass::FindConsumer(
   /* [in] */ IWbemClassObject __RPC_FAR *pLogicalConsumer,
   /* [out] */ IWbemUnboundObjectSink __RPC_FAR *__RPC_FAR *ppConsumer
   )
{
   // Examine the logical consumer to see which one it is.
   // ====================================================

   VARIANT v;    
   VariantInit(&v);

   HRESULT hRes = WBEM_E_NOT_FOUND;
   *ppConsumer = 0;

   pLogicalConsumer->Get(_bstr_t(L"Name"), 0, &v, 0, 0);

   // Decide which of the two logical consumers to send back.
   // =======================================================

   if (_wcsicmp(V_BSTR(&v), L"Consumer1") == 0)
   {

    //send back the Consumer1 sink to WMI
    // For example:
      /*hRes =  m_pConsumer1->
         QueryInterface(IID_IWbemUnboundObjectSink,
                           (LPVOID*)ppConsumer);*/
   }
   else if (_wcsicmp(V_BSTR(&v), L"Consumer2") == 0)
   {
    //send back the Consumer2 sink to WMI
    // For example:
      /*hRes =  m_pConsumer2->
          QueryInterface(IID_IWbemUnboundObjectSink,
                            (LPVOID*)ppConsumer);*/
   }

   VariantClear(&v);
   return hRes;
}

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista
Server minimum yang didukung Windows Server 2008
Target Platform Windows
Header wbemprov.h (termasuk Wbemidl.h)
Pustaka Wbemuuid.lib
DLL Wbemsvc.dll

Lihat juga

IWbemEventConsumerProvider

Menerima Peristiwa Setiap Saat

Menerima Peristiwa selama Durasi Aplikasi Anda