Membongkar Penyedia
Setelah WMI selesai dengan penyedia, WMI menghapus penyedia dari memori. Alasan utama WMI melepaskan penyedia adalah untuk menghemat sumber daya sistem. Oleh karena itu, Anda harus menambahkan kode yang memungkinkan WMI untuk membongkar penyedia Anda dengan cara yang efisien. Dibutuhkan waktu mulai dari rentang yang disebutkan dalam pengaturan cache hingga dua kali rentang waktu tersebut bagi WMI untuk membongkar penyedia.
WMI membongkar penyedia dengan salah satu cara berikut:
- Melepaskan penyedia setelah penyedia menyelesaikan tugas yang diberikan padanya.
- Bongkar semua penyedia dengan cepat saat pengguna mematikan sistem. Perhatikan bahwa WMI menghentikan penyedia dalam proses ketika layanan WMI dimatikan dari baris perintah.
Meskipun skenario pertama lebih umum, Anda harus menghubungi penyedia Anda untuk kedua kemungkinan.
Bagian berikut dibahas dalam topik ini:
- Membongkar Penyedia Tidak Aktif
- Mengakses Waktu Tidak Aktif untuk Penyedia
- Menghentikan Penyedia yang Juga Merupakan Klien WMI
- Melepas Penyedia Selama Shutdown
- Topik terkait
Menghentikan Penyedia Tidak Aktif
WMI melakukan tindakan berikut saat membongkar penyedia yang menganggur:
Menentukan apakah penyedia menganggur.
WMI menggunakan properti ClearAfter untuk menentukan berapa lama penyedia mungkin tetap tidak aktif sebelum memuat keluar penyedia tersebut. Untuk informasi selengkapnya, lihat Mengakses Waktu Menganggur untuk Penyedia.
Memanggil metode Releasedari penyedia.
Jika penyedia adalah penyedia murni, maka Release sepenuhnya menghapus penyedia dari memori aktif. Namun, penyedia tidak murni dapat terus beroperasi setelah panggilan WMI di Release.
Mengakses Waktu Menganggur untuk Penyedia
Jumlah minimum waktu penyedia tetap aktif ditentukan oleh properti ClearAfter. Anda dapat menemukan ClearAfter dalam instance kelas yang diturunkan dari kelas sistem WMI __CacheControl di ruang nama \root.
Daftar berikut menjelaskan kelas yang berasal dari __CacheControl, yang mengontrol penghentian muatan penyedia.
- __EventConsumerProviderCacheControl
- __EventProviderCacheControl
- __EventSinkCacheControl
- __ObjectProviderCacheControl
- __PropertyProviderCacheControl
Anda dapat mengubah jumlah waktu minimum yang WMI izinkan penyedia untuk tetap tidak aktif dengan mengedit properti ClearAfter dalam instans kontrol cache untuk jenis penyedia tertentu. Misalnya, untuk membatasi jumlah waktu penyedia properti dapat tidak aktif, Anda akan mengedit properti ClearAfter dari instans __PropertyProviderCacheControl di namespace oot \r.
Menghentikan Penyedia yang Juga Menjadi Klien WMI
Penyedia Anda mungkin perlu tetap menjadi klien WMI setelah menyelesaikan fungsi penyedia yang dipanggil untuk melakukan. Misalnya, penyedia notifikasi mungkin perlu melakukan kueri ke WMI. Untuk informasi selengkapnya, lihat Menentukan Status Dorong atau Tarik. Dalam hal ini, properti Murni dari instans __Win32Provider yang mewakili penyedia harus diatur ke TRUE. Jika properti Pure diatur ke FALSE, penyedia bersiap untuk membongkar dengan memanggil IUnknown::Release pada semua titik antarmuka yang tersisa saat WMI memanggil metode Release antarmuka utamanya. Untuk informasi selengkapnya, lihat bagian Keterangan di __Win32Provider.
Prosedur berikut menjelaskan cara menerapkan metode rilis untuk antarmuka utama penyedia Anda.
Untuk menghapus penyedia
Lepaskan semua pointer antarmuka yang disimpan terhadap WMI saat WMI memanggil metode Rilis antarmuka utama penyedia Anda.
Biasanya, penyedia memegang pointer ke antarmuka IWbemServices dan IWbemContext yang disediakan dalam IWbemProviderInit::Initialize.
Jika properti Pure dalam instans __Win32Provider terkait diatur ke FALSE, penyedia dapat beralih ke peran aplikasi klien setelah WMI memanggil Release. Namun, WMI tidak bisa membongkar penyedia yang berfungsi sebagai sistem klien, yang meningkatkan overhead sistem.
Penyedia dengan Pure diatur ke TRUE hanya ada untuk melayani permintaan. Oleh karena itu, jenis penyedia ini tidak dapat mengambil peran aplikasi klien dan WMI dapat memuat ulangnya.
Memuat Turun Penyedia Selama Proses Penonaktifan
Dalam kondisi normal, menggunakan panduan dalam Membongkar Penyedia yang Juga merupakan Klien WMI memungkinkan WMI untuk membongkar penyedia Anda dengan benar. Namun, Anda mungkin mengalami situasi di mana WMI tidak dapat memulai prosedur penghentian normal, seperti ketika pengguna memilih untuk menutup sistem. Dengan menggunakan model transaksi penyimpanan data, selain menerapkan strategi pembersihan yang baik, Anda dapat memastikan bahwa penyedia Anda dibersihkan dengan benar.
Pengguna dapat menghentikan WMI kapan saja. Dalam situasi seperti itu, WMI tidak membongkar penyedia apa pun atau memanggil titik masuk DllCanUnloadNow pada penyedia dalam proses apa pun. Selain itu, jika penyedia yang sedang berjalan berada di tengah-tengah panggilan metode saat terjadi pemadaman, WMI mungkin dapat mengakhiri utas yang sedang dijalankan di tengah panggilan tersebut. Dalam keadaan ini, WMI tidak memanggil rutinitas yang biasanya menangani tugas pembersihan, seperti halnya destruktor sebuah objek. Paling banyak, WMI hanya akan memanggil DllMain.
Ketika sistem operasi mematikan WMI, sistem secara otomatis melepaskan semua memori yang telah dialokasikan untuk penyedia dalam proses. Sistem operasi juga menutup kebanyakan sumber daya yang dipegang oleh penyedia, seperti handle berkas, handle jendela, dan sebagainya. Penyedia tidak perlu mengambil tindakan tertentu untuk memungkinkan ini terjadi.
Karena WMI dapat dimatikan di tengah panggilan, penyedia tidak boleh meninggalkan sumber data dalam status tidak konsisten. Meninggalkan data Anda dalam status tidak konsisten bukanlah masalah bagi penyedia baca-saja (read-only). Namun, penyedia dengan kemampuan menulis mungkin ingin menerapkan semacam model transaksi untuk memungkinkan pemulihan yang aman setelah penghentian mendadak.
Meskipun sistem operasi dapat merilis beberapa sumber daya sistem umum, sistem tidak secara otomatis merilis semua sumber daya. Misalnya, sistem operasi mungkin tidak merilis soket atau koneksi database. Sebagai gantinya, penyedia mungkin perlu membersihkan sumber daya tersebut secara manual. Untuk menghindari masalah ini, Anda dapat mengimplementasikan penyedia Anda secara terpisah dari proses utama, atau menambahkan kode untuk pembersihan.
Solusi paling sederhana adalah menerapkan penyedia Anda di luar proses. Penyedia di luar proses tidak dimatikan ketika WMI dimatikan, meskipun WMI akan merilis penyedia setelah batas waktu COM. Penyedia yang masalah ketahanan pembersihan dan penghentiannya lebih penting daripada performa mungkin di luar proses.
Jika Anda harus memasukkan kode pembersihan di penyedia layanan Anda, Anda memiliki dua pilihan. Satu tempat untuk melakukan pembersihan semacam ini adalah DllMain, yaitu fungsi titik masuk DLL yang dipanggil oleh sistem operasi saat membongkar DLL. Kode pembersihan dapat ditambahkan langsung ke DllMain, menjalankannya sebagai respons terhadap DLL_PROCESS_DETACH. Menerapkan kode pembersihan di DllMain mungkin agak sulit diatur, terutama di lingkungan pemrograman seperti MFC atau ATL. Untuk informasi selengkapnya, lihat artikel Pangkalan Pengetahuan Microsoft Q148791, "Cara Menyediakan DllMain Anda Sendiri di DLL Reguler MFC." (Sumber daya ini mungkin tidak tersedia di beberapa bahasa dan negara atau wilayah.)
Secara bergantian, Anda juga dapat menempatkan kode pembersihan di destruktor kelas global. Untuk informasi selengkapnya, lihat Membongkar Penyedia. Sistem operasi Windows tidak mengalokasikan objek global pada timbunan. Sebagai gantinya, sistem operasi memanggil destruktor selama pembongkaran DLL.
Berikut ini adalah prosedur pembersihan sederhana yang dapat pas di dalam objek global untuk WMI.
class CMyCleanup
{
~CMyCleanup()
{
CloseHandle(m_hOpenFile);
CloseDatabaseConnection(g_hDatabase);
}
} g_Cleanup;
Ada banyak batasan tentang apa yang dapat dilakukan dalam kode pembersihan dengan salah satu pendekatan. Misalnya, baik utas maupun DLL yang tidak ditautkan secara implisit tidak dapat diakses dengan cara apa pun. Selanjutnya, Anda tidak dapat melakukan panggilan COM dalam keadaan apa pun.
Topik terkait
-
Mengatur Deskriptor Keamanan Namepace