Membuat dan Mendeklarasikan Instans Menggunakan C++

Anda dapat membuat instans di C++ melalui antarmuka IWbemServices .

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

#include <wbemidl.h>

Prosedur berikut menjelaskan cara membuat instans kelas yang sudah ada.

Untuk membuat instans kelas yang sudah ada

  1. Ambil definisi kelas yang ada dengan memanggil metode IWbemServices::GetObject atau IWbemServices::GetObjectAsync .

    Contoh kode berikut menunjukkan cara menggunakan metode GetObject dan GetObjectAsync untuk mendapatkan penunjuk ke antarmuka IWbemClassObject yang menyediakan akses ke definisi kelas.

    // The pSv variable is of type IWbemServices *
    
    IWbemClassObject *pNewInstance = 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 instans baru dengan memanggil metode IWbemClassObject::SpawnInstance .

    Contoh kode berikut menunjukkan cara membuat instans baru lalu merilis kelas.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Atur nilai untuk properti apa pun yang tidak mewarisi nilai yang ditentukan untuk kelas dengan memanggil metode IWbemClassObject::P ut .

    Setiap instans kelas mewarisi semua properti yang ditentukan untuk kelas . Namun, Anda dapat menentukan nilai properti yang berbeda jika Anda memilih.

    Jika kelas yang ada memiliki properti kunci, Anda harus mengatur properti baik ke NULL atau nilai unik yang dijamin. Jika Anda mengatur kunci ke NULL dan kuncinya adalah string, maka PutInstanceAsync atau PutInstance secara internal menghasilkan dan menetapkan GUID ke kunci. Dengan cara ini, menentukan NULL untuk properti kunci memungkinkan Anda membuat instans unik yang tidak akan menimpa instans sebelumnya.

    Contoh kode berikut menunjukkan cara mengatur nilai properti Indeks dari contoh kelas instans.

    VARIANT v;
    VariantInit(&v);
    
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");
    
    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);
    
  4. Atur nilai untuk setiap kualifikasi yang relevan melalui panggilan ke IWbemClassObject::GetQualifierSet.

    Metode GetQualifierSet mengembalikan penunjuk ke antarmuka IWbemQualifierSet , yang digunakan untuk mengakses kualifikasi untuk kelas atau instans. Anda dapat menentukan nilai yang berbeda untuk kualifikasi yang ditentukan untuk kelas jika ragam kualifikasi kelas adalah EnableOverride. Anda tidak dapat mengubah atau menghapus kualifikasi kelas dengan ragam yang diatur ke DisableOverride. Untuk informasi selengkapnya, lihat Qualifier Flavors.

    Sebagai opsi, Anda juga dapat menentukan kualifikasi tambahan untuk kelas instans Anda. Anda dapat menentukan kualifikasi tambahan untuk instans atau properti instans yang tidak perlu muncul dalam deklarasi kelas.

  5. Simpan instans dengan memanggil metode IWbemServices::P utInstance atau IWbemServices::P utInstanceAsync .

    WMI menyimpan instans di namespace layanan WMI saat ini. Dengan demikian, jalur lengkap instans tergantung pada namespace, yang biasanya root\default. Untuk contoh kode ini, nama jalur lengkapnya adalah \\.\root\default:Example.Index="IX100".

    Contoh kode berikut menunjukkan cara menyimpan instans.

        hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
        pNewInstance->Release();
    

Menyimpan instans ke WMI mengunci beberapa properti instans.

Secara khusus, Anda tidak dapat melakukan salah satu operasi berikut melalui API WMI setelah instans ada dalam infrastruktur WMI:

  • Ubah kelas induk kelas tempat instans berada.
  • Menambahkan atau menghapus properti.
  • Ubah jenis properti.
  • Menambahkan atau menghapus kualifikasi Kunci atau Terindeks .
  • Menambahkan atau menghapus kualifikasi Singleton, Dynamic, atau Abstract .

Contoh kode berikut menggabungkan contoh kode yang dibahas dalam prosedur sebelumnya untuk menunjukkan cara membuat instans menggunakan WMI API.

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

    // Get the class definition.
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
                 &pExampleClass, &pResult);
    SysFreeString(PathToClass);

    if (hRes != 0)
       return;

    // Create a new instance.
    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more

    VARIANT v;
    VariantInit(&v);

    // Set the Index property (the key).
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");

    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);

    // Set the IntVal property.
    V_VT(&v) = VT_I4;
    V_I4(&v) = 1001;  
    
    BSTR Prop = SysAllocString(L"IntVal");
    pNewInstance->Put(Prop, 0, &v, 0);
    SysFreeString(Prop);
    VariantClear(&v);    
    
    // Other properties acquire the 'default' value specified
    // in the class definition unless otherwise modified here.

    // Write the instance to WMI. 
    hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
    pNewInstance->Release();
}