Création et déclaration d’une instance en C++

Vous pouvez créer une instance en C++ via l’interface IWbemServices.

Les exemples de code de cette rubrique nécessitent l’instruction #include suivante pour être compilés correctement.

#include <wbemidl.h>

La procédure suivante explique comment créer une instance d’une classe existante.

Pour créer une instance d’une classe existante

  1. Récupérez la définition de la classe existante en appelant les méthodes IWbemServices::GetObject ou IWbemServices::GetObjectAsync.

    L’exemple de code suivant montre comment utiliser les méthodes GetObject et GetObjectAsync pour obtenir un pointeur vers l’interface IWbemClassObject, qui permet d’accéder à la définition de 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. Créez l’instance en appelant la méthode IWbemClassObject::SpawnInstance.

    L’exemple de code suivant montre comment créer une instance, et comment publier la classe.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Définissez les valeurs des propriétés qui n’héritent pas des valeurs définies pour la classe en appelant la méthode IWbemClassObject::Put.

    Chaque instance d’une classe hérite de toutes les propriétés définies pour la classe. Toutefois, vous pouvez spécifier d’autres valeurs de propriété, si vous le souhaitez.

    Si la classe existante a une propriété de clé, vous devez affecter à la propriété la valeur NULL ou une valeur unique garantie. Si vous affectez à la clé la valeur NULL, et si la clé est une chaîne, PutInstanceAsync ou PutInstance génère et affecte un GUID à la clé de manière interne. Ainsi, en spécifiant la valeur NULL pour une propriété de clé, vous pouvez créer une instance unique qui ne remplace aucune instance précédente.

    L’exemple de code suivant montre comment définir la valeur de propriété Index de l’exemple de classe d’instance.

    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. Définissez les valeurs de tous les qualificateurs appropriés via un appel à IWbemClassObject::GetQualifierSet.

    La méthode GetQualifierSet retourne un pointeur vers une interface IWbemQualifierSet, qui permet d’accéder aux qualificateurs d’une classe ou d’une instance. Vous pouvez spécifier des valeurs distinctes pour un qualificateur défini pour la classe si le type de qualificateur de classe est EnableOverride. Vous ne pouvez pas modifier ou supprimer un qualificateur de classe dont le type a la valeur DisableOverride. Pour plus d’informations, consultez Types de qualificateur.

    Vous pouvez également définir des qualificateurs supplémentaires pour votre classe d’instance. Vous pouvez définir des qualificateurs supplémentaires pour l’instance ou la propriété d’instance, qui n’ont pas besoin d’apparaître dans la déclaration de classe.

  5. Enregistrez l’instance en appelant la méthode IWbemServices::PutInstance ou IWbemServices::PutInstanceAsync.

    WMI enregistre l’instance dans l’espace de noms WMI actuel. Ainsi, le chemin complet de l’instance dépend de l’espace de noms, qui est généralement root\default. Pour cet exemple de code, le chemin complet est \\.\root\default:Example.Index="IX100".

    L’exemple de code suivant montre comment enregistrer une instance.

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

L’enregistrement de l’instance dans WMI verrouille plusieurs de ses propriétés.

Plus précisément, vous ne pouvez pas effectuer les opérations suivantes via l’API WMI une fois qu’une instance existe au sein de l’infrastructure WMI :

  • Changer la classe parente de la classe à laquelle l’instance appartient.
  • Ajouter ou supprimer des propriétés.
  • Apporter des changements aux types de propriété.
  • Ajouter ou supprimer les qualificateurs Key ou Indexed.
  • Ajouter ou supprimer les qualificateurs Singleton, Dynamic ou Abstract.

L’exemple de code suivant combine les exemples de code décrits dans la procédure précédente pour montrer comment créer une instance à l’aide de 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();
}