Membongkar Penyedia

Setelah WMI selesai dengan penyedia, WMI akan membongkar penyedia dari memori. Alasan utama WMI membongkar 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 di mana saja dari interval yang ditentukan dalam kontrol cache hingga dua kali interval tersebut bagi WMI untuk membongkar penyedia.

WMI membongkar penyedia dengan salah satu cara berikut:

  • Membongkar penyedia setelah penyedia menyelesaikan tugas yang diberikan padanya.
  • Bongkar semua penyedia dengan cepat saat pengguna mematikan sistem. Perhatikan bahwa WMI membongkar penyedia dalam proses saat layanan WMI dimatikan dari baris perintah.

Meskipun skenario pertama lebih umum, Anda harus menulis penyedia Anda untuk kedua kemungkinan tersebut.

Bagian berikut dibahas dalam topik ini:

Membongkar Penyedia Menganggur

WMI melakukan tindakan berikut saat membongkar penyedia diam:

  • Menentukan apakah penyedia menganggur.

    WMI menggunakan properti ClearAfter untuk menentukan berapa lama penyedia dapat tetap menganggur sebelum membongkar penyedia tersebut. Untuk informasi selengkapnya, lihat Mengakses Waktu Menganggur untuk Penyedia.

  • Memanggil metode Rilis penyedia.

    Jika penyedia adalah penyedia murni, maka Rilis sepenuhnya menghapus penyedia dari memori aktif. Namun, penyedia nonpure dapat terus berjalan setelah WMI memanggil Rilis.

Mengakses Waktu Menganggur untuk Penyedia

Jumlah waktu minimum penyedia tetap aktif ditentukan oleh properti ClearAfter . Anda dapat menemukan ClearAfter dalam instans kelas yang berasal dari kelas sistem WMI __CacheControl di namespace layanan \root.

Daftar berikut menjelaskan kelas yang berasal dari __CacheControl, yang mengontrol pembongkaran penyedia:

Anda dapat mengubah jumlah waktu minimum WMI yang memungkinkan penyedia untuk tetap tidak aktif dengan mengedit properti ClearAfter di instans kontrol cache untuk jenis penyedia tertentu. Misalnya, untuk membatasi jumlah waktu penyedia properti dapat tetap menganggur, Anda akan mengedit properti ClearAfter dari instans __PropertyProviderCacheControl di namespace layanan \root.

Membongkar Penyedia yang Juga Merupakan Klien WMI

Penyedia Anda mungkin perlu tetap menjadi klien WMI setelah menyelesaikan fungsi penyedia yang dipanggil untuk melakukan. Misalnya, penyedia push mungkin perlu mengeluarkan kueri ke WMI. Untuk informasi selengkapnya, lihat Menentukan Status Pendorongan atau Penarikan. 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 luar biasa ketika WMI memanggil metode Rilis antarmuka utamanya. Untuk informasi selengkapnya, lihat bagian Keterangan di __Win32Provider.

Prosedur berikut menjelaskan cara menerapkan metode rilis untuk antarmuka utama penyedia Anda.

Untuk membongkar penyedia

  1. Lepaskan semua pointer antarmuka yang disimpan terhadap WMI saat WMI memanggil metode Rilis antarmuka utama penyedia Anda.

    Biasanya, penyedia menyimpan pointer ke antarmuka IWbemServices dan IWbemContext yang disediakan di IWbemProviderInit::Initialize.

  2. Jika properti Murni dalam instans __Win32Provider terkait diatur ke FALSE, penyedia dapat beralih ke peran aplikasi klien setelah WMI memanggil Rilis. Namun, WMI tidak dapat membongkar penyedia yang beroperasi sebagai sistem klien, yang meningkatkan overhead sistem.

    Penyedia dengan Pure yang diatur ke TRUE hanya ada untuk permintaan layanan. Oleh karena itu, jenis penyedia ini tidak dapat mengambil peran aplikasi klien dan WMI dapat membongkarnya.

Membongkar Penyedia Selama Matikan

Dalam keadaan normal, menggunakan pedoman 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 menghasut prosedur pembongkaran normal, seperti ketika pengguna memilih untuk mematikan sistem. Dengan menggunakan model transaksi penyimpanan data, selain menerapkan strategi pembersihan yang baik, Anda dapat memastikan bahwa penyedia Anda dibongkar 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. Selain itu, jika penyedia dalam proses berada di tengah panggilan metode pada saat pematian, WMI mungkin dapat menghentikan utas yang dieksekusi di tengah panggilan. Dalam keadaan ini, WMI tidak memanggil rutinitas yang biasanya menangani pembersihan, seperti destruktor objek. Paling banyak, WMI hanya akan memanggil DllMain .

Ketika sistem operasi mematikan WMI, sistem secara otomatis merilis semua memori yang dialokasikan untuk penyedia dalam proses. Sistem operasi juga menutup sebagian besar sumber daya yang dipegang oleh penyedia, seperti handel file, handel jendela, dan sebagainya. Penyedia tidak perlu mengambil tindakan khusus untuk meluruskan hal ini.

Karena WMI dapat dimatikan di tengah panggilan, penyedia tidak boleh meninggalkan sumber data dalam keadaan tidak konsisten. Meninggalkan data Anda dalam status tidak konsisten bukanlah masalah bagi penyedia baca-saja. Namun, penyedia dengan kemampuan tulis mungkin ingin menerapkan semacam model transaksi untuk memungkinkan pemutaran kembali 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. Sebaliknya, penyedia mungkin perlu membersihkan sumber daya tersebut secara manual. Untuk menghindari masalah ini, Anda dapat menerapkan penyedia Anda di luar proses, atau Anda dapat menambahkan kode 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 menempatkan kode pembersihan di penyedia Anda, Anda memiliki dua opsi. Satu tempat untuk melakukan pembersihan semacam ini adalah DllMain, fungsi titik masuk DLL yang dipanggil sistem operasi saat membongkar DLL. Kode pembersihan dapat ditambahkan langsung ke DllMain, mengeksekusinya sebagai respons terhadap DLL_PROCESS_DETACH. Menerapkan kode pembersihan di DllMain bisa 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 dalam 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. Sebaliknya, sistem operasi memanggil destruktor selama pembongkaran DLL.

Berikut ini adalah prosedur pembersihan sederhana yang dapat masuk ke 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 dapat diakses dengan cara apa pun. Selanjutnya, Anda tidak dapat melakukan panggilan COM dalam keadaan apa pun.

Mengatur Deskriptor Keamanan Namepace

Mengamankan Penyedia Anda

Mengembangkan Penyedia WMI