Bagikan melalui


Membuat Kelas Turunan WMI

Membuat kelas turunan di WMI sangat mirip dengan membuat kelas dasar. Seperti halnya kelas dasar, Anda harus terlebih dahulu menentukan kelas turunan dan kemudian mendaftarkan kelas turunan dengan WMI. Perbedaan utamanya adalah Anda harus terlebih dahulu menemukan kelas induk dari mana Anda ingin mengambil turunan. Untuk informasi selengkapnya, lihat Menulis Penyedia Kelas dan Menulis Penyedia Instans.

Cara yang disarankan untuk membuat kelas untuk penyedia adalah dalam file Managed Object Format (MOF). Beberapa kelas turunan yang terkait satu sama lain harus dikelompokkan ke dalam file MOF, bersama dengan kelas dasar dari mana mereka memperoleh properti atau metode. Jika Anda menempatkan setiap kelas dalam file MOF terpisah, setiap file harus dikompilasi sebelum penyedia dapat bekerja dengan baik.

Setelah membuat kelas, Anda harus menghapus semua instans kelas sebelum dapat melakukan salah satu aktivitas berikut pada kelas turunan Anda:

  • Ubah kelas induk kelas turunan Anda.
  • Menambahkan atau menghapus properti.
  • Ubah jenis properti.
  • Tambahkan atau hapus kualifikasi Key atau Indexed.
  • Tambahkan atau hapus Singleton, Dynamic, atau Abstract qualifier.

Nota

Untuk menambah, hapus, atau modifikasi properti atau kualifikasi, panggil IWbemServices::PutClass atau SWbemObject.Put_ dan atur parameter flag ke "mode 'paksa'". Abstract kualifikasi hanya dapat digunakan jika kelas induk abstrak.

 

Saat Anda mendeklarasikan kelas turunan Anda, amati aturan dan batasan berikut:

  • Kelas induk dari kelas turunan harus sudah ada.

    Deklarasi kelas induk dapat muncul dalam file MOF yang sama dengan kelas turunan atau dalam file yang berbeda. Jika kelas induk tidak diketahui, pengkompilasi menghasilkan kesalahan run-time.

  • Kelas turunan hanya dapat memiliki satu kelas induk.

    WMI tidak mendukung beberapa pewarisan. Namun, kelas induk dapat memiliki banyak kelas turunan.

  • Anda dapat menentukan indeks untuk kelas turunan, tetapi WMI tidak menggunakan indeks ini.

    Oleh karena itu, menentukan indeks pada kelas turunan tidak meningkatkan performa kueri untuk instans kelas turunan. Anda dapat meningkatkan performa kueri pada kelas turunan dengan menentukan properti terindeks untuk kelas induk kelas turunan.

  • Definisi kelas turunan bisa lebih kompleks, dan dapat mencakup fitur seperti alias, kualifikasi, dan variasi kualifikasi.

    Untuk informasi selengkapnya, lihat Membuat Alias dan Menambahkan Kualifikasi.

  • Jika Anda ingin mengubah kualifikasi, ubah nilai default properti kelas dasar, atau ketik properti referensi atau objek yang disematkan lebih kuat dari kelas dasar, Anda harus mendeklarasikan seluruh kelas dasar lagi.

  • Jumlah maksimum properti yang dapat Anda tentukan dalam kelas WMI adalah 1024.

Nota

Kelas tidak dapat diubah selama eksekusi penyedia layanan. Anda harus menghentikan aktivitas, mengubah kelas, lalu memulai ulang layanan Manajemen Windows. Mendeteksi perubahan kelas saat ini tidak dimungkinkan.

 

Seperti halnya kelas dasar, penggunaan teknik ini yang paling umum adalah oleh aplikasi klien. Namun, penyedia juga dapat membuat kelas turunan. Untuk informasi selengkapnya, lihat Membangun Kelas Dasar dan Membangun Penyedia Kelas.

Contoh kode dalam topik ini memerlukan pernyataan #include berikut untuk dikompilasi dengan benar.

#include <wbemidl.h>

Prosedur berikut menjelaskan cara membuat kelas turunan menggunakan C++.

Untuk membuat kelas turunan menggunakan C++

  1. Temukan kelas dasar dengan panggilan ke IWbemServices::GetObject.

    Contoh kode berikut menunjukkan cara menemukan kelas Contoh dasar.

    // The pSv variable is of type IWbemServices *
    
    IWbemClassObject *pNewDerivedClass = 0;
    IWbemClassObject *pExampleClass = 0;
    IWbemContext *pCtx = 0;
    IWbemCallResult *pResult = 0;
    
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, &pExampleClass, &pResult);
    SysFreeString(PathToClass);
    
  2. Buat objek turunan dari kelas dasar dengan panggilan ke IWbemClassObject::SpawnDerivedClass.

    Contoh kode berikut menunjukkan cara membuat objek kelas turunan.

    pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
    pExampleClass->Release();  // Don't need the parent class any more
    
  3. Tetapkan nama untuk kelas dengan mengatur properti sistem __CLASS melalui panggilan ke metode IWbemClassObject::Put.

    Contoh kode berikut menunjukkan cara menetapkan nama ke kelas turunan.

    VARIANT v;
    VariantInit(&v);
    
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"Example2");
    BSTR Class = SysAllocString(L"__CLASS");
    pNewDerivedClass->Put(Class, 0, &v, 0);
    SysFreeString(Class);
    VariantClear(&v);
    
  4. Buat properti tambahan dengan IWbemClassObject::Put.

    Contoh kode berikut menunjukkan cara membuat properti tambahan.

    BSTR OtherProp = SysAllocString(L"OtherInfo2");
    pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
    SysFreeString(OtherProp);
    
  5. Simpan kelas baru dengan memanggil IWbemServices::PutClass.

    Contoh kode berikut menunjukkan cara menyimpan kelas turunan baru.

    hRes = pSvc->PutClass(pNewDerivedClass, 0, pCtx, &pResult);
    pNewDerivedClass->Release();
    

Contoh kode berikut menggabungkan contoh kode yang dibahas dalam prosedur sebelumnya untuk menjelaskan cara membuat kelas turunan menggunakan WMI API.

void CreateDerivedClass(IWbemServices *pSvc)
{
  IWbemClassObject *pNewDerivedClass = 0;
  IWbemClassObject *pExampleClass = 0;
  IWbemContext *pCtx = 0;
  IWbemCallResult *pResult = 0;

  BSTR PathToClass = SysAllocString(L"Example");
  HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
    &pExampleClass, &pResult);
  SysFreeString(PathToClass);

  if (hRes != 0)
    return;

  pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
  pExampleClass->Release();  // The parent class is no longer needed

  VARIANT v;
  VariantInit(&v);

  // Create the class name.
  // =====================

  V_VT(&v) = VT_BSTR;
  V_BSTR(&v) = SysAllocString(L"Example2");
  BSTR Class = SysAllocString(L"__CLASS");
  pNewDerivedClass->Put(Class, 0, &v, 0);
  SysFreeString(Class);
  VariantClear(&v);

  // Create another property.
  // =======================
  BSTR OtherProp = SysAllocString(L"OtherInfo2");
  // No default value
  pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
  SysFreeString(OtherProp);
  
  // Register the class with WMI. 
  // ============================
  hRes = pSvc->PutClass(pNewDerivedClass, 0, pCtx, &pResult);
  pNewDerivedClass->Release();
}

Prosedur berikut menjelaskan cara menentukan kelas turunan menggunakan kode MOF.

Untuk menentukan kelas turunan menggunakan kode MOF

  1. Tentukan kelas turunan Anda dengan kata kunci Kelas, diikuti dengan nama kelas turunan Anda, dan nama kelas induk yang dipisahkan oleh titik dua.

    Contoh kode berikut menjelaskan implementasi kelas turunan.

    class MyClass 
    {
        [key] string   strProp;
        sint32   dwProp1;
        uint32       dwProp2;
    };
    
    class MyDerivedClass : MyClass
    {
        string   strDerivedProp;
        sint32   dwDerivedProp;
    };
    
  2. Setelah selesai, kompilasi kode MOF Anda dengan pengkompilasi MOF.

    Untuk informasi selengkapnya, lihat Mengkompilasi File MOF.

Membuat Kelas