Partilhar via


Fazer chamadas para WMI

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

Cada método de IWbemServices que um provedor pode implementar tem um parâmetro pCtx, um ponteiro para uma implementação de interfaceIWbemContext. Quando o WMI chama o provedor, o WMI passa um ponteiro válido neste parâmetro. Um provedor deve sempre passar esse mesmo ponteiro em todas as chamadas para WMI que fizer durante o atendimento de solicitações. Negligenciar a definição pCtx corretamente 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);
}

O exemplo de código C++ neste tópico requer as seguintes referências e instruções #include para compilar 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 chamadas para o WMI solicitando a modificação de dados durante o atendimento de uma solicitação de leitura. Os únicos provedores que são exceções a essa regra são os provedores push. Um provedor push é um provedor de classe que armazena dados no repositório WMI e depende do WMI para lidar com solicitações de clientes. Ao atender a uma solicitação de leitura, um provedor de push pode atualizar o repositório WMI, mas deve definir o parâmetro lFlags para WBEM_FLAG_OWNER_UPDATE na chamada deIWbemServices apropriada.

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

Desenvolvendo um provedor WMI

Definindo Descritores de Segurança Namepace

Proteger o seu fornecedor