Compartilhar via


Realizando 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 independentemente de o provedor chamar 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, o WMI passa um ponteiro válido nesse parâmetro. Um provedor sempre deve passar esse mesmo ponteiro em todas as chamadas para WMI que ele faz ao atender solicitações. Deixar de definir pCtx adequadamente 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 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 chamadas ao WMI solicitando a modificação de dados durante o serviço de uma solicitação de leitura. Os únicos provedores que são exceções a essa regra são os provedores de 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. Durante o atendimento de uma solicitação de leitura, um provedor de push pode atualizar o repositório WMI, mas deve definir o parâmetro lFlags como WBEM_FLAG_OWNER_UPDATE na chamada IWbemServices apropriada.

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

Desenvolver um provedor WMI

Definindo descritores de segurança do namespace

Protegendo seu provedor