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.
Tópicos relacionados