Поделиться через


Создание и определение экземпляра на 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::Put.

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

    Если существующий класс имеет свойство ключа, необходимо задать для свойства значение NULL 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. Вы не можете изменить или удалить квалификатор класса с характеристикой DisableOverride. Дополнительные сведения см. в разделе Qualifier Flavors.

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

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

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

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

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

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

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

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

Следующий пример кода объединяет примеры кода, описанные в предыдущей процедуре, чтобы показать, как создать экземпляр с помощью 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();
}