Partilhar via


Criando uma classe derivada do WMI

Criar uma classe derivada no WMI é muito semelhante à criação de uma classe base. Como em uma classe base, você deve primeiro definir a classe derivada e, em seguida, registrar a classe derivada com WMI. A principal diferença é que deves primeiro localizar a superclasse da qual desejas derivar. Para obter mais informações, consulte Como Criar um Provedor de Classe e Como Criar um Provedor de Instância.

A maneira recomendada de criar classes para um provedor é em arquivos MOF (Managed Object Format). Várias classes derivadas que estão relacionadas entre si devem ser agrupadas em um arquivo MOF, juntamente com quaisquer classes base das quais derivam propriedades ou métodos. Se você colocar cada classe em um arquivo MOF separado, cada arquivo deve ser compilado antes que o provedor possa funcionar corretamente.

Depois de criar sua classe, você deve excluir todas as instâncias de sua classe antes de poder executar qualquer uma das seguintes atividades em sua classe derivada:

  • Altere a classe pai da sua classe derivada.
  • Adicione ou remova propriedades.
  • Altere os tipos de propriedade.
  • Adicione ou remova os qualificadores de Chave ou os qualificadores de Indexado .
  • Adicione ou remova qualificadores Singleton, Dynamicou Abstract.

Observação

Para adicionar, remover ou modificar uma propriedade ou qualificador, chame IWbemServices::PutClass ou SWbemObject.Put_ e defina o parâmetro flag como "force mode". O qualificador Abstract pode ser usado somente se a classe pai for abstrata.

 

Ao declarar sua classe derivada, observe as seguintes regras e restrições:

  • A classe pai da classe derivada já deve existir.

    A declaração da classe pai pode aparecer no mesmo arquivo MOF que a classe derivada ou em um arquivo diferente. Se a classe pai for desconhecida, o compilador gerará um erro em tempo de execução.

  • Uma classe derivada pode ter apenas uma única classe pai.

    O WMI não suporta herança múltipla. No entanto, uma classe base pode ter muitas classes derivadas.

  • Você pode definir índices para classes derivadas, mas o WMI não usa esses índices.

    Portanto, especificar um índice em uma classe derivada não melhora o desempenho de consultas para instâncias da classe derivada. Você pode melhorar o desempenho de uma consulta em uma classe derivada especificando propriedades indexadas para a classe pai da classe derivada.

  • As definições de classes derivadas podem ser mais complexas, incluindo recursos como alcunhas, qualificadores e variações de qualificadores.

    Para obter mais informações, consulte Criando um alias e Adicionando um qualificador.

  • Se desejar alterar um qualificador, alterar o valor padrão de uma propriedade de classe base ou digitar mais fortemente uma propriedade de objeto de referência ou incorporada de uma classe base, você deverá declarar toda a classe base novamente.

  • O número máximo de propriedades que você pode definir em uma classe WMI é 1024.

Observação

As classes não podem ser alteradas durante a execução dos provedores. Tem de parar a atividade, alterar a classe e, em seguida, reiniciar o serviço de Gestão do Windows. Atualmente, não é possível detetar uma alteração de classe.

 

Tal como acontece com a classe base, o uso mais comum desta técnica será por aplicações cliente. No entanto, um provedor também pode criar uma classe derivada. Para obter mais informações, consulte Criação de uma Classe Base e Criação de um Provedor de Classe.

O exemplo de código neste tópico requer a seguinte instrução #include para compilar corretamente.

#include <wbemidl.h>

O procedimento a seguir descreve como criar uma classe derivada usando C++.

Para criar uma classe derivada usando C++

  1. Localize a classe base com uma chamada para IWbemServices::GetObject.

    O exemplo de código a seguir mostra como localizar a classe base Example.

    // The pSv variable is of type IWbemServices *
    
    IWbemClassObject *pNewDerivedClass = 0;
    IWbemClassObject *pExampleClass = 0;
    IWbemContext *pCtx = 0;
    IWbemCallResult *pResult = 0;
    
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, &pExampleClass, &pResult);
    SysFreeString(PathToClass);
    
  2. Crie um objeto derivado da classe base com uma chamada para IWbemClassObject::SpawnDerivedClass.

    O exemplo de código a seguir mostra como criar um objeto de classe derivado.

    pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
    pExampleClass->Release();  // Don't need the parent class any more
    
  3. Estabeleça um nome para a classe definindo a propriedade de sistema __CLASS com uma chamada para o método IWbemClassObject::Put.

    O exemplo de código a seguir mostra como atribuir um nome para a classe derivada.

    VARIANT v;
    VariantInit(&v);
    
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"Example2");
    BSTR Class = SysAllocString(L"__CLASS");
    pNewDerivedClass->Put(Class, 0, &v, 0);
    SysFreeString(Class);
    VariantClear(&v);
    
  4. Crie propriedades adicionais com IWbemClassObject::Put.

    O exemplo de código a seguir mostra como criar propriedades adicionais.

    BSTR OtherProp = SysAllocString(L"OtherInfo2");
    pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
    SysFreeString(OtherProp);
    
  5. Guarde a nova classe chamando IWbemServices::PutClass.

    O exemplo de código a seguir mostra como salvar a nova classe derivada.

    hRes = pSvc->PutClass(pNewDerivedClass, 0, pCtx, &pResult);
    pNewDerivedClass->Release();
    

O exemplo de código a seguir combina os exemplos de código discutidos no procedimento anterior para descrever como criar uma classe derivada usando a API WMI.

void CreateDerivedClass(IWbemServices *pSvc)
{
  IWbemClassObject *pNewDerivedClass = 0;
  IWbemClassObject *pExampleClass = 0;
  IWbemContext *pCtx = 0;
  IWbemCallResult *pResult = 0;

  BSTR PathToClass = SysAllocString(L"Example");
  HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
    &pExampleClass, &pResult);
  SysFreeString(PathToClass);

  if (hRes != 0)
    return;

  pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
  pExampleClass->Release();  // The parent class is no longer needed

  VARIANT v;
  VariantInit(&v);

  // Create the class name.
  // =====================

  V_VT(&v) = VT_BSTR;
  V_BSTR(&v) = SysAllocString(L"Example2");
  BSTR Class = SysAllocString(L"__CLASS");
  pNewDerivedClass->Put(Class, 0, &v, 0);
  SysFreeString(Class);
  VariantClear(&v);

  // Create another property.
  // =======================
  BSTR OtherProp = SysAllocString(L"OtherInfo2");
  // No default value
  pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
  SysFreeString(OtherProp);
  
  // Register the class with WMI. 
  // ============================
  hRes = pSvc->PutClass(pNewDerivedClass, 0, pCtx, &pResult);
  pNewDerivedClass->Release();
}

O procedimento a seguir descreve como definir uma classe derivada usando o código MOF.

Para definir uma classe derivada usando o código MOF

  1. Defina sua classe derivada com a palavra-chave Class, seguida pelo nome da classe derivada e o nome da classe pai separados por dois pontos.

    O exemplo de código a seguir descreve uma implementação de uma classe derivada.

    class MyClass 
    {
        [key] string   strProp;
        sint32   dwProp1;
        uint32       dwProp2;
    };
    
    class MyDerivedClass : MyClass
    {
        string   strDerivedProp;
        sint32   dwDerivedProp;
    };
    
  2. Quando terminar, compile seu código MOF com o compilador MOF.

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

Criar uma Classe