Creazione e dichiarazione di un'istanza con C++
È possibile creare un'istanza in C++ tramite l'interfaccia IWbemServices .
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 IWbemServices::GetObject o IWbemServices::GetObjectAsync .
Nell'esempio di codice seguente viene illustrato come usare i metodi GetObject e GetObjectAsync per ottenere un puntatore all'interfaccia IWbemClassObject che 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 metodo IWbemClassObject::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 tutte le proprietà che non ereditano i valori definiti per la classe chiamando il metodo IWbemClassObject::P ut .
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 illustrato 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);
Impostare i valori per tutti i qualificatori pertinenti tramite una chiamata a IWbemClassObject::GetQualifierSet.
Il metodo GetQualifierSet restituisce un puntatore a un'interfaccia IWbemQualifierSet , che consente di accedere ai qualificatori per una classe o un'istanza. È possibile specificare valori diversi per un qualificatore definito per la classe se il sapore 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 visualizzati nella dichiarazione di classe.
Salvare l'istanza chiamando il metodo IWbemServices::P utInstance o IWbemServices::P utInstanceAsync .
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 di .
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 l'esistenza di un'istanza all'interno dell'infrastruttura WMI:
- Modificare la classe padre della classe a cui appartiene l'istanza.
- Aggiungere o rimuovere proprietà.
- Modificare i tipi di proprietà.
- Aggiungere o rimuovere qualificatori chiave o indicizzati .
- Aggiungere o rimuovere qualificatori Singleton, Dynamic o Abstract .
Nell'esempio di codice seguente vengono combinati gli esempi di codice illustrati 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();
}