Creación y declaración de una instancia mediante C++

Puede crear una instancia en C++ mediante la interfaz IWbemServices.

Los ejemplos de código de este tema requieren la siguiente instrucción #include para compilarse correctamente.

#include <wbemidl.h>

En el procedimiento siguiente se describe cómo crear una instancia de una clase existente.

Para crear una instancia de una clase existente

  1. Recupere la definición de la clase existente mediante una llamada a los métodos IWbemServices::GetObject o IWbemServices::GetObjectAsync.

    En el ejemplo de código siguiente se muestra cómo usar los métodos GetObject y GetObjectAsync para obtener un puntero a la interfaz IWbemClassObject que proporciona acceso a la definición de clase.

    // 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. Cree la nueva instancia mediante una llamada al método IWbemClassObject::SpawnInstance.

    El ejemplo de código siguiente muestra cómo crear una nueva instancia y, a continuación, publicar la clase.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Establezca valores para las propiedades que no hereden los valores definidos para la clase mediante una llamada al método IWbemClassObject::Put.

    Cada instancia de una clase hereda todas las propiedades definidas de la clase. Sin embargo, puede especificar valores de propiedad diferentes si lo desea.

    Si la clase existente tiene una propiedad de clave, debe establecer la propiedad en NULL o en un valor único garantizado. Si establece la clave en NULL y la clave es una cadena, PutInstanceAsync o PutInstance genera internamente y asigna un GUID a la clave. De este modo, especificar NULL para una propiedad de clave le permite crear una instancia única que no sobrescribirá ninguna instancia anterior.

    En el ejemplo de código siguiente se muestra cómo establecer el valor de la propiedad Index de la clase de instancia de ejemplo.

    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. Establezca los valores de los calificadores pertinentes mediante una llamada a IWbemClassObject::GetQualifierSet.

    El método GetQualifierSet devuelve un puntero a una interfaz IWbemQualifierSet, que usa para acceder a los calificadores de una clase o instancia. Puede especificar valores diferentes para un calificador definido para la clase si el tipo de calificador de clase es EnableOverride. No se puede modificar ni eliminar un calificador de clase con el tipo establecido en DisableOverride. Para más información, consulte Tipos de calificador.

    Como opción, también puede definir calificadores adicionales para la clase de instancia. Puede definir calificadores adicionales para la instancia o para la propiedad instance que no es necesario que aparezcan en la declaración de clase.

  5. Guarde la instancia mediante una llamada al método IWbemServices::PutInstance o IWbemServices::PutInstanceAsync.

    WMI guarda la instancia en el espacio de nombres de WMI actual. Por lo tanto, la ruta de acceso completa de la instancia depende del espacio de nombres, que normalmente es root\default. En este ejemplo de código, el nombre de la ruta de acceso completo sería \\.\root\default:Example.Index="IX100".

    En el siguiente ejemplo de código se muestra cómo guardar una instancia.

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

Al guardar la instancia en WMI, se bloquean varias de las propiedades de la instancia.

Concretamente, no puede realizar ninguna de las siguientes operaciones mediante la API de WMI después de que exista una instancia dentro de la infraestructura de WMI:

  • Cambie la clase primaria de la clase a la que pertenece la instancia.
  • Agregue o quite propiedades.
  • Cambie los tipos de propiedad.
  • Agregue o quite los calificadores Key o Indexed.
  • Agregue o quite los calificadores Singleton, Dynamic o Abstract.

En el ejemplo de código siguiente se combinan los ejemplos de código descritos en el procedimiento anterior y se muestra cómo crear una instancia mediante la API de 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();
}