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