Menerapkan Konsumen Fisik
Konsumen fisik adalah objek COM yang mengimplementasikan antarmuka IWbemUnboundObjectSink . WMI memuat konsumen fisik Anda dan melewati peristiwa melalui IWbemUnboundObjectSink sebagai respons terhadap satu atau beberapa peristiwa, seperti yang didefinisikan oleh konsumen logis terkait. Konsumen permanen memiliki persyaratan keamanan khusus. Untuk informasi selengkapnya, lihat Mengamankan Peristiwa WMI.
Prosedur berikut menjelaskan cara menerapkan konsumen fisik untuk konsumen peristiwa permanen.
Mengimplementasikan konsumen fisik untuk konsumen peristiwa permanen
Membuat objek COM.
Anda harus menerapkan konsumen fisik sebagai server lokal atau jarak jauh menggunakan protokol COM.
Tentukan apakah Anda ingin mendukung pemberitahuan peristiwa sinkron atau asinkron.
Dengan pemberitahuan peristiwa asinkron, utas pengiriman tidak terkait dengan utas penerima. Oleh karena itu, baik WMI maupun penyedia acara tidak diblokir saat WMI memberikan pemberitahuan kepada konsumen mana pun yang terdaftar untuk menerima acara tersebut. Kerugian dari pengiriman asinkron adalah bahwa peralihan konteks terjadi antara waktu penyedia menghasilkan peristiwa dan waktu konsumen menerima peristiwa tersebut. Untuk informasi selengkapnya tentang bekerja secara asinkron, lihat topik Dasar-Dasar COM di bagian COM dari Microsoft Windows Software Development Kit (SDK). Untuk informasi selengkapnya tentang sakelar konteks, lihat topik Pengalihan Konteks di bagian DLL, Proses, dan Utas dari Windows SDK.
Catatan
Karena panggilan balik ke sink mungkin tidak dikembalikan pada tingkat autentikasi yang sama dengan yang dibutuhkan klien, disarankan agar Anda menggunakan semisinkron alih-alih komunikasi asinkron. Untuk informasi selengkapnya, lihat Memanggil Metode.
Dengan pemberitahuan sinkron, WMI memberikan pemberitahuan pada utas yang sama dengan yang digunakan penyedia peristiwa untuk mengirimkan peristiwa ke WMI. Dalam hal ini, ketika penyedia peristiwa mengirim pemberitahuan, penyedia peristiwa diblokir oleh WMI sampai WMI mengirimkan pemberitahuan. Hanya jika konsumen Anda sangat cepat dan dapat memproses peristiwa dalam 100 mikro detik atau kurang jika Anda mempertimbangkan untuk mendukung pemberitahuan sinkron. Konsumen sinkron yang membutuhkan waktu terlalu lama untuk memproses peristiwa dapat secara serius memperlambat pengiriman peristiwa ke semua konsumen lain. Selain itu, mereka secara tidak sengaja dapat memblokir penyedia. Untuk informasi selengkapnya, lihat Mengikat Filter Peristiwa dengan Konsumen Logis.
Terapkan fungsi IWbemUnboundObjectSink::IndicateToConsumer .
WMI menggunakan fungsi IndicateToConsumer untuk meneruskan pointer dan peristiwa yang diperlukan kepada konsumen fisik Anda untuk komunikasi sinkron dan asinkron. Implementasi IndicateToConsumer Anda harus berisi semua kode yang diperlukan untuk merespons suatu peristiwa.
Tidak seperti konsumen peristiwa sementara, Anda tidak perlu memanggil antarmuka IWbemLocator untuk menghubungi WMI. Sebaliknya, WMI menemukan penunjuk ke konsumen Anda melalui penyedia konsumen peristiwa. Untuk informasi selengkapnya, lihat Menulis Penyedia Konsumen Peristiwa.
Namun, jika Anda ingin memanggil kembali ke WMI, gunakan antarmuka IWbemLocator dan IWbemServices . Metode tradisional untuk menyambungkan ke WMI adalah selama proses inisialisasi objek COM Anda. Untuk informasi selengkapnya, lihat Membuat Aplikasi atau Skrip WMI.
Jika Anda menerapkan konsumen fisik Anda sebagai server COM dalam proses dan terhubung ke WMI secara terpisah dari proses inisialisasi, Anda harus menggunakan pengidentifikasi kelas CLSID_WbemAdministrativeLocator untuk mengakses antarmuka IWbemLocator dalam panggilan ke CoCreateInstance.
Contoh berikut menunjukkan cara menggunakan pengidentifikasi kelas CLSID_WbemAdministrativeLocator untuk mengakses antarmuka IWbemLocator .
IWbemLocator *pLoc = 0; DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
Antarmuka IWbemLocator mendapatkan penunjuk namespace awal ke WMI pada komputer host tertentu. Kegagalan untuk menggunakan pengidentifikasi CLSID_WbemAdministrativeLocator dalam panggilan CoCreateInstance mengakibatkan kesalahan "akses ditolak".
Dalam keadaan biasa, WMI memberikan peristiwa asinkron kepada klien satu per satu. Namun, jika klien tidak dapat menerima pemberitahuan peristiwa asinkron secepat peristiwa tiba, WMI mulai secara otomatis mengelompokkan peristiwa ke dalam satu panggilan. Batching otomatis membantu jika waktu pulang-pergi menjadi masalah, seperti yang sering terjadi dalam skenario throughput tinggi. Namun, batching tidak meningkatkan performa sistem jika klien atau bandwidth jaringan salah.