Создание и объявление экземпляра с помощью C++
Экземпляр на C++ можно создать с помощью интерфейса IWbemServices .
Примеры кода в этом разделе требуют правильной компиляции следующего оператора #include.
#include <wbemidl.h>
В следующей процедуре описывается создание экземпляра существующего класса.
Создание экземпляра существующего класса
Получите определение существующего класса, вызвав методы 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);
Создайте новый экземпляр, вызвав метод IWbemClassObject::SpawnInstance .
В следующем примере кода показано, как создать новый экземпляр, а затем освободить класс .
pExampleClass->SpawnInstance(0, &pNewInstance); pExampleClass->Release(); // Don't need the class any more
Задайте значения для всех свойств, которые не наследуют значения, определенные для класса, путем вызова метода 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);
Задайте значения для всех соответствующих квалификаторов с помощью вызова IWbemClassObject::GetQualifierSet.
Метод GetQualifierSet возвращает указатель на интерфейс IWbemQualifierSet , который использует для доступа к квалификаторам для класса или экземпляра. Можно указать различные значения для квалификатора, определенного для класса , если свойством квалификатора класса является EnableOverride. Вы не можете изменить или удалить квалификатор класса с параметром flavor set to DisableOverride. Дополнительные сведения см. в разделе Варианты квалификатора.
В качестве варианта можно также определить дополнительные квалификаторы для класса экземпляра. Можно определить дополнительные квалификаторы для экземпляра или свойства экземпляра, которые не должны отображаться в объявлении класса.
Сохраните экземпляр, вызвав метод 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();
}