Поделиться через


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

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

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

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

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

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

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

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

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

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

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

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

В следующем списке перечислены элементы декларации метода.

поставщик

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

Реализовано

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

ТипВозврата

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

имя метода

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

НаправлениеПараметра

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

IDQualifier

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

параметр

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

имя параметра

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

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

[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.

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

  3. Напишите входные параметры в первый класс, а выходные параметры во второй класс, используя один или несколько вызовов для IWbemClassObject::Put.

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

    • Обработайте параметры [in, out] как отдельные записи, один в объекте, который содержит встроенные параметры и один в объекте, который содержит параметры вне.

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

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

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

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

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

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

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

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

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

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