Создание метода WMI

Чтобы создать метод WMI, определите входные и выходные параметры для метода . Входные и выходные параметры представлены специальным системным классом WMI __PARAMETERS. Дополнительные сведения см. в разделах Вызов метода и Написание поставщика метода.

В этой статье рассматриваются следующие разделы:

Создание метода класса WMI в MOF

В WMI методы поставщика обычно являются отдельными действиями, связанными с объектом, который представляет класс. Вместо изменения значения свойства для выполнения действия необходимо создать метод . Например, можно включить или отключить сетевой информационный центр (NIC), представленный Win32_NetworkAdapter с помощью методов Enable и Disable . Хотя эти действия можно представить в виде свойства чтения и записи, рекомендуется создать метод . Кроме того, если вы хотите сделать состояние или значение видимым для класса, рекомендуемым подходом является создание свойства чтения и записи, а не метода. В Win32_NetworkAdapter свойство NetEnabled делает состояние адаптера видимым, но изменения между состояниями выполняются методами Enable или Disable .

Объявления классов могут включать объявление одного или нескольких методов. Вы можете либо наследовать методы родительского класса, либо реализовать собственный. Если вы решили реализовать собственные методы, необходимо объявить метод и пометить метод определенными тегами квалификатора.

В следующей процедуре описывается объявление метода в классе, который не наследуется от базового класса.

Объявление метода

  1. Определите имя метода между фигурными скобками объявления класса и любыми квалификаторами.

    В следующем примере кода описывается синтаксис метода .

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. По завершении вставьте код формата управляемого объекта (MOF) в репозиторий WMI с вызовом компилятора MOF.

    Дополнительные сведения см. в разделе Компиляция MOF-файлов.

В следующем списке определяются элементы объявления метода.

Поставщика

Связывает определенного поставщика с описанием класса. Значением квалификатора поставщика является имя поставщика, которое сообщает инструментарию WMI, где находится код, поддерживающий метод . Поставщик также должен пометить динамическим квалификатором любой класс, имеющий динамические экземпляры. В отличие от этого, не используйте динамический квалификатор для пометки класса, содержащего статический экземпляр, с помощью реализованных методов.

Реализованы

Объявляет, что вы будете реализовывать метод, а не наследовать реализацию метода от родительского класса. По умолчанию WMI распространяет реализацию родительского класса на производный класс, если только производный класс не предоставляет реализацию. Пропуск квалификатора Реализован означает, что метод не имеет реализации в этом классе. Если вы повторно объявляете метод без квалификатора Implement , WMI по-прежнему предполагает, что этот метод не будет реализован, и вызывает реализацию метода родительского класса при вызове. Таким образом, повторное объявление метода в производном классе без присоединения реализованного квалификатора полезно только при добавлении или удалении квалификатора в метод или из него.

Returntype

Описывает значение, возвращаемое методом. Возвращаемое значение метода должно быть логическим, числовым, CHAR, STRING, DATETIME или объектом схемы. Вы также можете объявить тип возвращаемого значения как VOID, указывая, что метод ничего не возвращает. Однако нельзя объявить массив в качестве возвращаемого типа значения.

Methodname

Определяет имя метода. Каждый метод должен иметь уникальное имя. WMI не позволяет существовать в одном классе или в иерархии классов два метода с одинаковым именем и разными сигнатурами. Таким образом, вы также не можете перегружать метод.

ParameterDirection

Содержит квалификаторы, описывающие, является ли параметр входным, выходным параметром или и тем, и другим. Не используйте одно и то же имя параметра несколько раз в качестве входного параметра или несколько раз в качестве выходного параметра. Если одно и то же имя параметра отображается с квалификаторами In и Out , функциональные возможности по сути совпадают с использованием квалификаторов In, Out для одного параметра. Однако при использовании отдельных объявлений входные и выходные параметры должны быть одинаковыми во всех остальных отношениях, включая количество и тип квалификаторов идентификаторов , а квалификатор должен быть одинаковым и явно объявлен для обоих. Настоятельно рекомендуется использовать квалификаторы In, Out в объявлении одного параметра.

IDQualifier

Содержит квалификатор идентификатора , который однозначно определяет положение каждого параметра в последовательности параметров в методе . По умолчанию компилятор MOF автоматически помечает параметры квалификатором идентификатора . Компилятор помечает первый параметр значением 0 (ноль), второй параметр значением 1 (один) и т. д. При необходимости можно явно указать последовательность идентификаторов в MOF-коде.

Тип параметра

Описывает тип данных, который может принимать метод. Тип параметра можно определить как любое значение данных MOF, включая массив, объект схемы или ссылку. При использовании массива в качестве параметра используйте массив как несвязанный или с явным размером.

ParameterName

Содержит имя параметра. На этом этапе также можно определить значение параметра по умолчанию. Параметры без начальных значений остаются неназначающими.

В следующем примере кода описывается список параметров и квалификаторы.

[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);
};

В следующем примере кода описывается использование массива в параметре 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]);
};

В следующем примере кода описывается использование объекта схемы в качестве параметра и возвращаемого значения.

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

В следующем примере кода описывается, как включить две ссылки: одну на экземпляр класса Win32_LogicalDisk , а другую на экземпляр неизвестного типа объекта.

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

Создание метода класса WMI в C++

В следующей процедуре описывается создание метода класса WMI программным способом.

Создание метода класса WMI программным способом

  1. Создайте класс, к которому будет принадлежать метод.

    Перед созданием метода необходимо создать класс, в который будет помещать метод.

  2. Получение двух дочерних классов системного класса __PARAMETERS с помощью IWbemServices::GetObject или GetObjectAsync.

    Используйте первый дочерний класс для описания параметров, а второй — для описания out-параметров. При необходимости можно выполнить одно извлечение с последующим вызовом метода IWbemClassObject::Clone .

  3. Запишите встроенные параметры в первый класс, а параметры out-parameters — во второй, используя один или несколько вызовов IWbemClassObject::P ut.

    При описании параметров метода соблюдайте следующие правила и ограничения.

    • Рассматривайте параметры [in, out] как отдельные записи: одну в объекте , который содержит параметры in, и другую в объекте , который содержит out-parameters.

    • Кроме квалификаторов [in, out] остальные квалификаторы должны быть точно такими же.

    • Укажите квалификаторы идентификатора , начиная с 0 (ноль), по одному для каждого параметра.

      Порядок входных или выходных параметров определяется значением квалификатора идентификатора для каждого параметра. Все входные аргументы должны предшествовать любым выходным аргументам. Изменение порядка входных и выходных параметров метода при обновлении существующего поставщика метода может привести к сбою приложений, вызывающих метод. Добавьте новые входные параметры в конце существующих параметров, а не вставьте их в уже установленную последовательность.

      Убедитесь, что в последовательности квалификатора идентификатора отсутствуют пробелы.

    • Поместите возвращаемое значение в класс out-parameters в качестве свойства с именем ReturnValue.

      При этом свойство определяется как возвращаемое значение метода . Тип CIM этого свойства является типом возвращаемого значения метода . Если метод имеет тип возвращаемого значения void, то у него вообще нет свойства ReturnValue . Кроме того, свойство ReturnValue не может иметь квалификатор идентификатора , например аргументы метода . При назначении квалификатора идентификатора свойству ReturnValue возникает ошибка WMI.

    • Выражение значений параметров по умолчанию для свойства в классе .

  4. Поместите оба __PARAMETERS объекты в родительский класс с помощью вызова IWbemClassObject::P utMethod.

    Один вызов PutMethod может поместить оба объекта __PARAMETERS в класс .

Создание класса