Criando um método WMI

Para criar um método WMI, defina os parâmetros de entrada e saída para o método. Os parâmetros de entrada e saída são representados por uma classe especial do sistema WMI __PARAMETERS. Para obter mais informações, consulte Chamar um método e escrever um provedor de métodos.

As seções a seguir são discutidas neste tópico:

Criando um método de classe WMI no MOF

No WMI, os métodos de provedor geralmente são ações distintas relacionadas ao objeto que a classe representa. Em vez de alterar o valor de uma propriedade para executar uma ação, um método deve ser criado. Por exemplo, você pode habilitar ou desabilitar uma NIC (central de informações de rede) representada por Win32_NetworkAdapter usando os métodos Habilitar e Desabilitar . Embora essas ações possam ser representadas como uma propriedade de leitura/gravação, o design recomendado é criar um método. Como alternativa, se você quiser tornar um estado ou valor visível para a classe, a abordagem recomendada é criar uma propriedade de leitura/gravação em vez de um método. Em Win32_NetworkAdapter, a propriedade NetEnabled torna o estado do adaptador visível, mas as alterações entre estados são executadas pelos métodos Enable ou Disable .

As declarações de classe podem incluir a declaração de um ou mais métodos. Você pode optar por herdar os métodos de uma classe pai ou implementar os seus próprios. Se você optar por implementar seus próprios métodos, deverá declarar o método e marcar o método com marcas de qualificação específicas.

O procedimento a seguir descreve como declarar um método em uma classe que não herda de uma classe base.

Para declarar um método

  1. Defina o nome do método entre as chaves de uma declaração de classe, seguida por quaisquer qualificadores.

    O exemplo de código a seguir descreve a sintaxe de um método.

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. Quando terminar, insira o código MOF (Managed Object Format) no repositório WMI com uma chamada para o compilador MOF.

    Para obter mais informações, consulte Compilando arquivos MOF.

A lista a seguir define os elementos da declaração do método.

Provedor

Vincula um provedor específico à descrição da classe. O valor do qualificador provedor é o nome do provedor, que informa ao WMI onde reside o código que dá suporte ao método. Um provedor também deve marcar com o qualificador dinâmico qualquer classe que tenha instâncias dinâmicas. Por outro lado, não use o qualificador dinâmico para marcar uma classe que contém uma instância estática com métodos implementados .

Implementado

Declara que você implementará um método, em vez de herdar a implementação do método da classe pai. Por padrão, o WMI propaga a implementação da classe pai para uma classe derivada, a menos que a classe derivada forneça uma implementação. Omitir o qualificador implementado indica que o método não tem nenhuma implementação nessa classe. Se você redeclare um método sem o qualificador implementado , o WMI ainda pressupõe que você não implementará esse método e invocará a implementação do método de classe pai quando chamado. Dessa forma, a redeclara de um método em uma classe derivada sem anexar o qualificador implementado é útil somente quando você adiciona ou remove um qualificador de ou para o método.

Returntype

Descreve qual valor o método retorna. O valor retornado de um método deve ser um objeto booliano, numérico, CHAR, STRING, DATETIME ou esquema. Você também pode declarar o tipo de retorno como VOID, indicando que o método não retorna nada. No entanto, você não pode declarar uma matriz como um tipo de valor retornado.

Methodname

Define o nome do método. Cada método deve ter um nome exclusivo. O WMI não permite que dois métodos com o mesmo nome e assinaturas diferentes existam em uma classe ou dentro de uma hierarquia de classe. Dessa forma, você também não pode sobrecarregar um método.

Parameterdirection

Contém qualificadores que descrevem se um parâmetro é um parâmetro de entrada, um parâmetro de saída ou ambos. Não use o mesmo nome de parâmetro mais de uma vez como um parâmetro de entrada ou mais de uma vez como um parâmetro de saída. Se o mesmo nome do parâmetro for exibido com os qualificadores de Entrada e Saída , a funcionalidade será conceitualmente a mesma que usar os qualificadores De Entrada e Saída em um único parâmetro. No entanto, ao usar declarações separadas, os parâmetros de entrada e saída devem ser exatamente iguais em todos os outros aspectos, incluindo o número e o tipo de qualificadores de ID , e o qualificador deve ser o mesmo e explicitamente declarado para ambos. É altamente recomendável usar os qualificadores In, Out dentro de uma única declaração de parâmetro.

IDQualifier

Contém o qualificador de ID que identifica exclusivamente a posição de cada parâmetro dentro da sequência de parâmetros no método. Por padrão, o compilador MOF marca automaticamente parâmetros com um qualificador de ID . O compilador marca o primeiro parâmetro com um valor de 0 (zero), o segundo parâmetro um valor de 1 (um) e assim por diante. Se necessário, você pode declarar explicitamente a sequência de ID em seu código MOF.

Parametertype

Descreve qual tipo de dados o método pode aceitar. Você pode definir um tipo de parâmetro como qualquer valor de dados MOF, incluindo uma matriz, um objeto de esquema ou uma referência. Ao usar uma matriz como parâmetro, use a matriz como desvinculada ou com um tamanho explícito.

Parametername

Contém o nome do parâmetro. Você também pode optar por definir o valor padrão do parâmetro neste momento. Parâmetros sem valores iniciais permanecem não atribuídos.

O exemplo de código a seguir descreve a listagem de parâmetros e qualificadores.

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

O exemplo de código a seguir descreve como usar uma matriz em um 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]);
};

O exemplo de código a seguir descreve o uso de um objeto de esquema como um parâmetro e um valor de retorno.

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

O exemplo de código a seguir descreve como incluir duas referências: uma para uma instância da classe Win32_LogicalDisk e outra para uma instância de um tipo de objeto desconhecido.

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

Criando um método de classe WMI no C++

O procedimento a seguir descreve como criar um método de classe WMI programaticamente.

Para criar um método de classe WMI programaticamente

  1. Crie a classe à qual o método pertencerá.

    Primeiro você deve ter uma classe para colocar o método antes de criar o método.

  2. Recupere duas classes filho da classe do sistema __PARAMETERS usando IWbemServices::GetObject ou GetObjectAsync.

    Use a primeira classe filho para descrever os parâmetros e a segunda para descrever os parâmetros externos. Se necessário, você pode executar uma única recuperação seguida de uma chamada para o método IWbemClassObject::Clone .

  3. Escreva os parâmetros na primeira classe e os parâmetros externos para a segunda classe, usando uma ou mais chamadas para IWbemClassObject::P ut.

    Ao descrever parâmetros para um método, observe as seguintes regras e restrições:

    • Trate os parâmetros [dentro, fora] como entradas separadas, uma no objeto que contém os parâmetros e outra no objeto que contém os parâmetros externos.

    • Além das qualificatórias [dentro, fora], as qualificatórias restantes devem ser exatamente as mesmas.

    • Especifique os qualificadores de ID , começando em 0 (zero), um para cada parâmetro.

      A ordem dos parâmetros de entrada ou saída é estabelecida pelo valor do qualificador de ID em cada parâmetro. Todos os argumentos de entrada devem preceder quaisquer argumentos de saída. Alterar a ordem dos parâmetros de entrada e saída do método ao atualizar um provedor de método existente pode fazer com que os aplicativos que chamam o método falhem. Adicione novos parâmetros de entrada no final dos parâmetros existentes em vez de inseri-los na sequência que já está estabelecida.

      Não deixe lacunas na sequência do qualificador de ID .

    • Coloque o valor retornado na classe out-parameters como uma propriedade chamada ReturnValue.

      Isso identifica a propriedade como o valor retornado do método. O tipo CIM dessa propriedade é o tipo de retorno do método. Se o método tiver um tipo de retorno nulo, não terá uma propriedade ReturnValue . Além disso, a propriedade ReturnValue não pode ter um qualificador de ID como os argumentos do método. Atribuir um qualificador de ID à propriedade ReturnValue produz um erro WMI.

    • Expresse quaisquer valores de parâmetro padrão para a propriedade na classe.

  4. Coloque os dois objetos __PARAMETERS na classe pai com uma chamada para IWbemClassObject::P utMethod.

    Uma única chamada para PutMethod pode colocar os dois objetos __PARAMETERS na classe.

Criando uma classe