Создание и объявление экземпляра с помощью C++

Экземпляр на C++ можно создать с помощью интерфейса IWbemServices .

Примеры кода в этом разделе требуют правильной компиляции следующего оператора #include.

#include <wbemidl.h>

В следующей процедуре описывается создание экземпляра существующего класса.

Создание экземпляра существующего класса

  1. Получите определение существующего класса, вызвав методы IWbemServices::GetObject или IWbemServices::GetObjectAsync .

    В следующем примере кода показано, как использовать методы GetObject и GetObjectAsync для получения указателя на интерфейс IWbemClassObject , предоставляющий доступ к определению класса.

    // 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. Создайте новый экземпляр, вызвав метод IWbemClassObject::SpawnInstance .

    В следующем примере кода показано, как создать новый экземпляр, а затем освободить класс .

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Задайте значения для всех свойств, которые не наследуют значения, определенные для класса, путем вызова метода IWbemClassObject::P ut .

    Каждый экземпляр класса наследует все свойства, определенные для класса . Однако при желании можно указать другие значения свойств.

    Если существующий класс имеет свойство key, следует задать для свойства значение NULL или гарантированное уникальное значение. Если для ключа задано значение NULL и ключ является строкой, то PutInstanceAsync или PutInstance внутренне создает и назначает ключу GUID. Таким образом, указание NULL для свойства ключа позволяет создать уникальный экземпляр, который не будет перезаписывать предыдущий экземпляр.

    В следующем примере кода показано, как задать значение свойства Index класса экземпляра примера.

    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. Задайте значения для всех соответствующих квалификаторов с помощью вызова IWbemClassObject::GetQualifierSet.

    Метод GetQualifierSet возвращает указатель на интерфейс IWbemQualifierSet , который использует для доступа к квалификаторам для класса или экземпляра. Можно указать различные значения для квалификатора, определенного для класса , если свойством квалификатора класса является EnableOverride. Вы не можете изменить или удалить квалификатор класса с параметром flavor set to DisableOverride. Дополнительные сведения см. в разделе Варианты квалификатора.

    В качестве варианта можно также определить дополнительные квалификаторы для класса экземпляра. Можно определить дополнительные квалификаторы для экземпляра или свойства экземпляра, которые не должны отображаться в объявлении класса.

  5. Сохраните экземпляр, вызвав метод IWbemServices::P utInstance или IWbemServices::P utInstanceAsync .

    WMI сохраняет экземпляр в текущем пространстве имен WMI. Таким образом, полный путь к экземпляру зависит от пространства имен, которое обычно имеет значение root\default. В этом примере кода полное имя пути будет \\.\root\default:Example.Index="IX100".

    В следующем примере кода показано, как сохранить экземпляр .

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

Сохранение экземпляра в WMI блокирует некоторые свойства экземпляра.

В частности, после существования экземпляра в инфраструктуре WMI невозможно выполнить какие-либо из следующих операций с помощью API WMI:

  • Измените родительский класс класса, к которому принадлежит экземпляр .
  • Добавление или удаление свойств.
  • Изменение типов свойств.
  • Добавьте или удалите квалификаторы key или indexed .
  • Добавление или удаление одноэлементных, динамических или абстрактных квалификаторов.

В следующем примере кода объединяются примеры кода, описанные в предыдущей процедуре, чтобы показать, как создать экземпляр с помощью API WMI.

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();
}