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

  1. 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);
    
  2. 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
    
  3. 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);
    
  4. 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.

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