Creazione e dichiarazione di un'istanza con C++
È possibile creare un'istanza in C++ tramite l'interfacciaIWbemServices.
Gli esempi di codice in questo argomento richiedono che l'istruzione #include seguente venga compilata correttamente.
#include <wbemidl.h>
La procedura seguente descrive come creare un'istanza di una classe esistente.
Per creare un'istanza di una classe esistente
Recuperare la definizione della classe esistente chiamando i metodi di IWbemServices::GetObject o IWbemServices::GetObjectAsync.
Nell'esempio di codice seguente viene illustrato come usare i metodi GetObject e GetObjectAsync per ottenere un puntatore all'interfacciaIWbemClassObjectche fornisce l'accesso alla definizione della classe.
// 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);
Creare la nuova istanza chiamando il metodoIWbemClassObject::SpawnInstance.
Nell'esempio di codice seguente viene illustrato come creare una nuova istanza e quindi rilasciare la classe .
pExampleClass->SpawnInstance(0, &pNewInstance); pExampleClass->Release(); // Don't need the class any more
Impostare i valori per le proprietà che non ereditano i valori definiti per la classe chiamando il metodo IWbemClassObject::Put.
Ogni istanza di una classe eredita tutte le proprietà definite per la classe . Tuttavia, è possibile specificare valori di proprietà diversi se si sceglie.
Se la classe esistente ha una proprietà chiave, è necessario impostare la proprietà su NULL o su un valore univoco garantito. Se si imposta la chiave su NULL e la chiave è una stringa, PutInstanceAsync o PutInstance genera internamente e assegna un GUID alla chiave. In questo modo, specificando NULL per una proprietà chiave, è possibile creare un'istanza univoca che non sovrascriverà alcuna istanza precedente.
Nell'esempio di codice seguente viene mostrato come impostare il valore della proprietà Index della classe di istanza di esempio.
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);
Imposta i valori dei qualificatori pertinenti attraverso una chiamata a IWbemClassObject::GetQualifierSet.
Il metodo GetQualifierSet restituisce un puntatore a un'interfaccia IWbemQualifierSet, che si usa per accedere ai qualificatori per una classe o un'istanza. È possibile specificare valori diversi per un qualificatore definito per la classe se la caratteristica del qualificatore di classe è EnableOverride. Non è possibile modificare o eliminare un qualificatore di classe con il tipo impostato su DisableOverride. Per altre informazioni, vedere Tipi di qualificatore.
Come opzione, è anche possibile definire qualificatori aggiuntivi per la classe dell'istanza. È possibile definire qualificatori aggiuntivi per l'istanza o la proprietà dell'istanza che non devono essere visualizzate nella dichiarazione di classe.
Salvare l'istanza chiamando il metodo IWbemServices::PutInstance o IWbemServices::PutInstanceAsync.
WMI salva l'istanza nello spazio dei nomi WMI corrente. Di conseguenza, il percorso completo dell'istanza dipende dallo spazio dei nomi , che in genere è root\default. Per questo esempio di codice, il nome completo del percorso sarà \\.\root\default:Example.Index="IX100".
Nell'esempio di codice seguente viene illustrato come salvare un'istanza.
hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult); pNewInstance->Release();
Il salvataggio dell'istanza in WMI blocca diverse proprietà dell'istanza.
In particolare, non è possibile eseguire alcuna delle operazioni seguenti tramite l'API WMI dopo che un'istanza esiste all'interno dell'infrastruttura WMI:
- Modifica la classe padre della classe a cui l'istanza appartiene.
- Aggiungere o rimuovere proprietà.
- Modificare i tipi di proprietà.
- Aggiungere o rimuovere chiave o qualificatori indicizzati di.
- Aggiungere o rimuovere qualificatori Singleton, Dynamico Abstract.
Nell'esempio di codice seguente vengono combinati gli esempi di codice descritti nella procedura precedente per illustrare come creare un'istanza usando l'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();
}