Partilhar via


Criar uma classe derivada do WMI

A criação de uma classe derivada no WMI é muito semelhante à criação de uma classe base. Assim como acontece com uma classe base, primeiro você deve definir a classe derivada e, em seguida, registrar a classe derivada no WMI. A principal diferença é que primeiro você deve localizar a classe pai da qual deseja derivar. Para obter mais informações, confira Escrever um provedor de classe e Escrever um provedor de instância.

A maneira recomendada de criar classes para um provedor é nos arquivos MOF (Managed Object Format). Várias classes derivadas que sejam relacionadas devem ser agrupadas em um arquivo MOF, juntamente com as classes base das quais derivam propriedades ou métodos. Se você colocar cada classe em um arquivo MOF diferente, cada arquivo deverá ser compilado para que o provedor possa funcionar corretamente.

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

  • Alterar a classe pai da classe derivada.
  • Adicionar ou remover propriedades.
  • Alterar tipos de propriedade.
  • Adicionar ou remover qualificadores Key ou Indexed.
  • Adicionar ou remover qualificadores Singleton, Dynamic ou Abstract.

Observação

Para adicionar, remover ou modificar uma propriedade ou um qualificador, chame IWbemServices::PutClass ou SWbemObject.Put_ e defina o parâmetro de sinalizador como "modo de força". O qualificador Abstract só poderá ser usado se a classe pai for abstrata.

 

Ao declarar a 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 classe pai.

    O WMI não oferece suporte à herança múltipla. No entanto, uma classe pai pode ter muitas classes derivadas.

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

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

  • As definições da classe derivada podem ser mais complexas e podem incluir recursos como aliases, qualificadores e tipos de qualificador.

    Para obter mais informações, consulte Criar um alias e Adicionar um qualificador.

  • Se você quiser alterar um qualificador, alterar o valor padrão de uma propriedade de classe base ou tipar mais fortemente uma referência ou propriedade de objeto inserido de uma classe base, 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 de provedores. Interrompa a atividade, altere a classe e reinicie o serviço de Gerenciamento do Windows. No momento, não é possível detectar uma alteração de classe.

 

Assim como acontece com a classe base, o uso mais comum dessa técnica será por aplicativos cliente. No entanto, um provedor também pode criar uma classe derivada. Para obter mais informações, confira Criar uma classe base e Escrever um provedor de classe.

O exemplo de código neste tópico requer que as instruções #include a seguir sejam compiladas corretamente.

#include <wbemidl.h>

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

Para criar uma classe derivada usando o C++

  1. Localize a classe base com uma chamada ao 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 derivada.

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

    O exemplo de código a seguir mostra como atribuir um nome à 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 descreve como criar propriedades adicionais.

    BSTR OtherProp = SysAllocString(L"OtherInfo2");
    pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
    SysFreeString(OtherProp);
    
  5. Salve 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 do 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 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 separada 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. Ao concluir, compile o código MOF com o compilador MOF.

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

Criar uma classe