Partilhar via


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 de sistema WMI especial __PARAMETERS. Para obter mais informações, consulte Chamando um Método e Escrevendo um Provedor de Método.

As seguintes seções 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 um centro de informações de rede (NIC) representado 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. No Win32_NetworkAdapter, a propriedade NetEnabled torna visível o estado do adaptador, 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 tags de qualificador 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 seu método entre as chaves de uma declaração de classe, seguido 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 de método.

Provedor

Vincula um provedor específico à descrição da sua classe. O valor do qualificador do Provedor é o nome do provedor, que informa ao WMI onde reside o código que suporta o seu método. Um provedor também deve marcar com o qualificador Dynamic qualquer classe que tenha instâncias dinâmicas. Por outro lado, não use o qualificador Dynamic para indicar uma classe que possui 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 Implemented indica que o método não tem implementação nessa classe. Se se redeclarar um método sem o qualificador Implementado, o WMI ainda assumirá que esse método não será implementado e invocará a implementação do método da classe pai quando for chamado. Assim, redefinir um método numa classe derivada sem anexar o qualificador Implementado é útil apenas quando se adiciona ou remove um qualificador ao método ou dele.

TipoDeRetorno

Descreve o valor que o método retorna. O valor de retorno para um método deve ser um Booleano, numérico, CHAR, STRING, DATETIMEou objeto de 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 de retorno.

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. Como tal, você também não pode sobrecarregar um método.

DireçãoDeParâmetro

Contém qualificadores que descrevem se um parâmetro é um parâmetro de entrada, 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 de parâmetro aparecer com os qualificadores In e Out, a funcionalidade é conceitualmente a mesma que utilizar os qualificadores In, Out num único parâmetro. No entanto, ao usar declarações separadas, os parâmetros de entrada e saída devem ser exatamente os mesmos em todos os outros aspetos, incluindo o número e o tipo de ID qualificadores, 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.

QualificadorID

Contém o qualificador 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 os 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.

TipoDeParâmetro

Descreve o tipo de dados que o método pode aceitar. Você pode definir um tipo de parâmetro como qualquer valor de dados MOF, incluindo uma matriz, objeto de esquema ou referência. Ao usar uma matriz como parâmetro, use a matriz como não limitada 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. Os 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 em 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á.

    Você deve primeiro ter uma classe para colocar o método antes de criar o método.

  2. Recupere duas classes derivadas da classe de sistema __PARAMETERS usando IWbemServices::GetObject ou GetObjectAsync.

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

  3. Escreva os parâmetros de entrada para a primeira classe e os parâmetros de saída para a segunda classe, usando uma ou mais chamadas para IWbemClassObject::Put.

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

    • Trate os parâmetros [in, out] como entradas separadas, uma no objeto que contém os parâmetros in-e outra no objeto que contém os out-parameters.

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

    • Especifique os qualificadores de ID de , 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 do 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 já estabelecida.

      Certifique-se de não deixar lacunas na sequência de qualificação do ID .

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

      Isso identifica a propriedade como o valor de retorno do método. O tipo CIM desta propriedade é o tipo de retorno do método. Se o método tiver um tipo de retorno void, então não deverá haver uma propriedade ReturnValue. Além disso, a propriedade ReturnValue não pode ter um qualificador de ID como os argumentos do método. A atribuição de um qualificador de de ID de à propriedade ReturnValue produz um erro WMI.

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

  4. Coloque ambos os objetos __PARAMETERS na classe pai com uma chamada para IWbemClassObject::PutMethod.

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

Criando uma Classe