Creación de un método de WMI

Para crear un método de WMI, defina los parámetros de entrada y salida del método. Los parámetros de entrada y salida se representan mediante una clase de sistema de WMI especia,l __PARAMETERS. Para más información, consulte Llamar a un método WMI y Escribir un proveedor de métodos.

En este tema se describen las secciones siguientes:

Creación de un método de clase WMI en MOF

En WMI, los métodos de proveedor suelen ser acciones distintas relacionadas con el objeto que representa la clase. En lugar de cambiar el valor de una propiedad para ejecutar una acción, se debe crear un método. Por ejemplo, puede habilitar o deshabilitar un centro de información de red (NIC) representado por Win32_NetworkAdapter mediante los métodos Enable y Disable. Aunque estas acciones se pueden representar como una propiedad de lectura y escritura, el diseño recomendado es crear un método. Como alternativa, si quiere que un estado o un valor sean visibles para la clase, el enfoque recomendado es crear una propiedad de lectura y escritura en lugar de un método. En Win32_NetworkAdapter, la propiedad NetEnabled hace visible el estado del adaptador, pero los métodos Enable o Disable ejecutan los cambios entre estados.

Las declaraciones de clase pueden incluir la declaración de uno o varios métodos. Puede elegir heredar los métodos de una clase principal o implementar los suyos propios. Si decide implementar sus propios métodos, debe declarar el método y marcarlo con etiquetas de calificador específicas.

En el procedimiento siguiente se describe cómo declarar un método en una clase que no hereda de una clase base.

Declaración de un método

  1. Defina el nombre del método entre las llaves de una declaración de clase, seguido de los calificadores.

    En el ejemplo de código siguiente se describe la sintaxis de un método.

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. Cuando termine, inserte el código de Managed Object Format (MOF) en el repositorio de WMI con una llamada al compilador de MOF.

    Para más información, consulte Compilación de archivos MOF.

En la lista siguiente se definen los elementos de la declaración de método.

Provider

Vincula un proveedor específico a la descripción de la clase. El valor del calificador Provider es el nombre del proveedor, que indica a WMI dónde reside el código que admite el método. Un proveedor también debe marcar con el calificador Dynamic cualquier clase que tenga instancias dinámicas. Por el contrario, no use el calificador Dynamic para marcar una clase que contenga una instancia estática con métodos Implemented.

Implemented

Declara que se implementará un método, en lugar de heredar la implementación del método de la clase principal. De forma predeterminada, WMI propaga la implementación de la clase principal a una clase derivada a menos que la clase derivada proporcione una implementación. Si se omite el calificador Implemented, se indica que el método no tiene ninguna implementación en esa clase. Si vuelve a declarar un método sin el calificador Implemented, WMI sigue presuponiendo que no va a implementar ese método e invoca la implementación del método de clase principal cuando se le llama. Por lo tanto, volver a declarar un método en una clase derivada sin asociar el calificador Implemented solo es útil cuando se agrega un calificador al método o se quita de este.

ReturnType

Describe qué valor devuelve el método. El valor devuelto de un método debe ser un objeto booleano, numérico, CHAR, STRING, DATETIME o de esquema. También puede declarar el tipo de valor devuelto como VOID, lo que indica que el método no devuelve nada. Sin embargo, no se puede declarar una matriz como un tipo de valor devuelto.

MethodName

Define el nombre del método. Cada método debe tener un nombre único. WMI no permite que dos métodos con el mismo nombre y firmas diferentes existan en una clase o dentro de una jerarquía de clases. Por lo tanto, tampoco puede sobrecargar un método.

ParameterDirection

Contiene calificadores que describen si un parámetro es un parámetro de entrada, un parámetro de salida o ambos. No use el mismo nombre de parámetro más de una vez como parámetro de entrada o de salida. Si aparece el mismo nombre de parámetro con los calificadores In y Out, la funcionalidad es conceptualmente la misma que el uso de los calificadores In, Out en un solo parámetro. Sin embargo, al usar distintas declaraciones, los parámetros de entrada y salida deben ser exactamente iguales en todos los demás aspectos, como el número y el tipo de los calificadores ID, y el calificador debe ser el mismo y declararse explícitamente para ambos. Se recomienda encarecidamente usar los calificadores In, Out dentro de una única declaración de parámetro.

IDQualifier

Contiene el calificador ID que identifica de forma única la posición de cada parámetro dentro de la secuencia de parámetros del método. De forma predeterminada, el compilador de MOF marca automáticamente los parámetros con un calificador ID. El compilador marca el primer parámetro con un valor de 0 (cero), el segundo parámetro con un valor de 1 (uno), etc. Si es necesario, puede indicar explícitamente la secuencia de identificadores en el código MOF.

ParameterType

Describe qué tipo de datos puede aceptar el método. Puede definir un tipo de parámetro como cualquier valor de datos MOF, incluidos una matriz, un objeto de esquema o una referencia. Cuando se use una matriz como parámetro, utilícela como sin enlazar o con un tamaño explícito.

ParameterName

Contiene el nombre del parámetro. También puede definir el valor predeterminado del parámetro en este momento. Los parámetros que carecen de valores iniciales permanecen sin asignar.

En el ejemplo de código siguiente se describen los calificadores y la lista de parámetros.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] sint32 InParam);
    [Implemented] 
    void MyMethod2 ([in, id(0)] sint32 InParam, 
       [out, id(1)] sint32 OutParam);
    [Implemented] 
    sint32 MyMethod3 ([in, out, id(0)] sint32 InOutParam);
};

En el ejemplo de código siguiente se describe cómo usar una matriz en un parámetro MOF.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk DiskParam[]);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] Win32_LogicalDisk DiskParam[32]);
};

En el ejemplo de código siguiente se describe el uso de un objeto de esquema como parámetro y valor devuelto.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk 
        DiskParam);
    [Implemented] 
    Win32_LogicalDisk MyMethod2 ([in, id(0)] string DiskVolLabel);
};

En el ejemplo de código siguiente se describe cómo incluir dos referencias: una a una instancia de la clase Win32_LogicalDisk y la otra a una instancia de un tipo de objeto desconocido.

[Dynamic, Provider("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk ref DiskRef);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] object ref AnyObject);
};

Creación de un método de clase WMI en C++

En el procedimiento siguiente se describe cómo crear un método de clase WMI mediante programación.

Creación de un método de clase WMI mediante programación

  1. Cree la clase a la que pertenecerá el método.

    Primero debe tener una clase en la que colocar el método antes de crearlo.

  2. Recupere dos clases secundarias de la clase del sistema __PARAMETERS mediante IWbemServices::GetObject o GetObjectAsync.

    Use la primera clase secundaria para describir los parámetros de entrada y el segundo para describir los parámetros de salida. Si es necesario, puede realizar una sola recuperación seguida de la llamada al método IWbemClassObject::Clone.

  3. Escriba los parámetros de entrada en la primera clase y los parámetros de salida en la segunda clase, mediante una o varias llamadas a IWbemClassObject::P ut.

    Al describir parámetros en un método, observe las siguientes reglas y restricciones:

    • Trate los parámetros [in, out] como entradas independientes, una en el objeto que contiene los parámetros de entrada y otro en el objeto que contiene los parámetros de salida.

    • Aparte de los calificadores [in, out], el resto de calificadores deben ser exactamente iguales.

    • Especifique los calificadores ID, a partir de 0 (cero), uno para cada parámetro.

      El orden de los parámetros de entrada o salida se establece mediante el valor del calificador ID en cada parámetro. Todos los argumentos de entrada deben preceder a los argumentos de salida. Cambiar el orden de los parámetros de entrada y salida del método al actualizar un proveedor de métodos existente puede provocar un error en las aplicaciones que llaman al método. Agregue nuevos parámetros de entrada al final de los parámetros existentes en lugar de insertarlos en la secuencia que ya está establecida.

      Asegúrese de no dejar huecos en la secuencia de los calificadores ID.

    • Coloque el valor devuelto en la clase de parámetros de salida como una propiedad llamada ReturnValue.

      Esto identifica la propiedad como el valor devuelto del método. El tipo CIM de esta propiedad es el tipo de valor devuelto del método. Si el método tiene un tipo de valor devuelto nulo, entonces no tiene una propiedad ReturnValue. Además, la propiedad ReturnValue no puede tener un calificador ID como los argumentos del método. La asignación de un calificador ID a la propiedad ReturnValue genera un error de WMI.

    • Exprese los valores de parámetro predeterminados de la propiedad en la clase.

  4. Coloque ambos objetos __PARAMETERS en la clase principal con una llamada a IWbemClassObject::P utMethod.

    Una sola llamada a PutMethod puede colocar ambos objetos __PARAMETERS en la clase.

Crear una clase