Fazer chamadas para o WMI

Os provedores podem chamar métodos implementados pelo WMI de dentro de suas implementações de método. No entanto, há considerações especiais quando um provedor chama a implementação WMI de um método IWbemServices de dentro de sua própria implementação do mesmo método. Essas considerações são importantes sem importar se o provedor chama a versão síncrona ou assíncrona do método.

Cada método IWbemServices que um provedor pode implementar tem um parâmetro pCtx, um ponteiro para uma implementação de interface IWbemContext. Quando o WMI chama o provedor, ele passa um ponteiro válido nesse parâmetro. Um provedor sempre deve passar esse mesmo ponteiro em todas as chamadas para o WMI que eles fazem durante a manutenção de solicitações. Negligenciar a definição adequada de pCtx pode fazer com que o WMI inicie um loop infinito.

O exemplo de código a seguir mostra a maneira correta de chamar a implementação WMI de GetObject de dentro de uma implementação de GetObjectAsync.

STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
    long lFlags, IWbemContext *pCtx,
    IWbemObjectSink *pHandler)
{
  IWbemClassObject *pclObj = NULL;
  IWbemServices* m_pNamespace;
  HRESULT hr = m_pNamespace->GetObject(
      _bstr_t(L"AClass"), 0, pCtx, &pclObj, 
      NULL );
  pclObj->Release();
  return pHandler->SetStatus(0, hr, NULL, NULL);
}

Os exemplos de código C++ neste tópico exigem que as referências e instruções #include a seguir sejam compiladas corretamente.

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

Os provedores de instância, classe e propriedade não devem emitir nenhuma chamada para WMI solicitando a modificação de dados durante a manutenção de uma solicitação de leitura. Os únicos provedores que são exceções a essa regra são provedores de push. Um provedor de push é um provedor de classe que armazena dados no repositório do WMI e depende do WMI para processar solicitações de clientes. Durante o atendimento de uma solicitação de leitura, um provedor de push pode atualizar o repositório do WMI, mas deve definir o parâmetro lFlags como WBEM_FLAG_OWNER_UPDATE na chamada IWbemServices adequada.

Os provedores de eventos não devem fazer nenhuma alteração de classe durante o atendimento a uma chamada. Eles também não podem emitir chamadas relacionadas a eventos, como modificar um filtro de evento.

Desenvolver um provedor do WMI

Definir descritores de segurança de namespace

Como proteger seu provedor