Método IWbemEventConsumerProvider::FindConsumer (wbemprov.h)
A função FindConsumer localiza e retorna objetos de coletor para os quais o WMI pode enviar eventos. O WMI passa um ponteiro para um objeto de consumidor lógico e, em seguida, FindConsumer localiza o consumidor físico associado ao consumidor lógico. Por fim, FindConsumer retorna ao WMI um ponteiro para o coletor que pertence ao consumidor físico. O WMI chama AddRef no coletor e começa a entregar os eventos apropriados ao coletor. O WMI libera o coletor após um período configurável sem entregas. Se necessário, o WMI pode chamar FindConsumer novamente para carregar o coletor novamente.
Sintaxe
HRESULT FindConsumer(
[in] IWbemClassObject *pLogicalConsumer,
[out] IWbemUnboundObjectSink **ppConsumer
);
Parâmetros
[in] pLogicalConsumer
Ponteiro para o objeto de consumidor lógico ao qual os objetos de evento devem ser entregues.
[out] ppConsumer
Retorna um coletor de objeto de evento para o Gerenciamento do Windows. O Gerenciamento do Windows chama AddRef para esse ponteiro e entrega os eventos associados ao consumidor lógico para esse coletor. Eventualmente, após um tempo limite adequado, o Gerenciamento do Windows chama Release para o ponteiro.
Retornar valor
Esse método retorna um HRESULT que indica o status da chamada de método. A lista a seguir lista o valor contido em um HRESULT.
Comentários
O Gerenciamento do Windows fornece eventos na forma de IWbemClassObject para consumidores lógicos registrados no esquema. Um provedor de consumidor implementa FindConsumer para fornecer um coletor de eventos para o Gerenciamento do Windows sempre que os eventos devem ser entregues ao consumidor lógico.
O Gerenciamento do Windows reconhece o objeto de consumidor lógico e tem os objetos de evento prontos para entrega. Para entregar um objeto de evento, o WMI chama FindConsumer. O provedor de consumidor deve criar um objeto de coletor de eventos (um ponteiro para IWbemUnboundObjectSink) e retornar o ponteiro para o Gerenciamento do Windows para que os eventos possam ser entregues.
Usando essa técnica, um único provedor de consumidores de eventos pode lidar com a entrega de eventos para muitos consumidores lógicos diferentes retornando diferentes ponteiros IWbemUnboundObjectSink para cada um.
Você pode implementar FindConsumer de várias maneiras:
-
Forneça um único coletor para todos os consumidores lógicos.
Essa abordagem é a mais eficiente em termos de espaço porque apenas um objeto COM é armazenado na memória. Por exemplo, considere um provedor de consumidores de eventos que fornece coletores para consumidores lógicos que registram mensagens em arquivos: o coletor único tem a responsabilidade de examinar os dados incluídos em cada consumidor lógico e determinar como proceder. Provavelmente, cada evento recebido envolve abrir um arquivo de log, registrar a mensagem em log e fechar o arquivo. Embora seja eficiente em termos de espaço, essa estratégia envolve uma quantidade significativa de tempo de processamento.
-
Forneça um coletor diferente para cada consumidor lógico.
Essa abordagem otimiza o desempenho, tendo um coletor dedicado pronto para receber um evento à medida que o evento ocorre. Essa estratégia é mais rápida do que um único coletor, mas menos eficiente devido ao seu custo em termos de memória. Como cada coletor mantém seu próprio arquivo de log, o arquivo sempre pode estar aberto e pronto para registrar mensagens como eventos. Em seguida, o coletor pode fechar o arquivo quando o WMI libera o coletor após um tempo limite, fornecendo um desempenho eficiente tanto em cenários de entrega de alta velocidade quanto em cenários de entrega de baixa velocidade.
-
Divida os consumidores lógicos em grupos e forneça um coletor diferente para cada grupo.
Essa abordagem compromete o desempenho e a eficiência. A abordagem híbrida pode envolver ter alguns arquivos de log diferentes, possivelmente com cada um vinculado ao tipo de mensagem a ser registrada. Vários objetos COM lidam com vários arquivos abertos. Um provedor de consumidor de eventos que usa essa abordagem lê o nome do arquivo de log durante a chamada FindConsumer , abre o arquivo e retorna o coletor que registra todas as mensagens nesse arquivo. O provedor fecha o arquivo na última chamada para o método Release . Com essa abordagem, o consumidor preserva a eficiência porque tem informações sobre exatamente qual arquivo usar; o consumidor não é necessário para pesquisar ou abrir um novo arquivo. Além disso, o consumidor pode economizar memória combinando coletores que registram mensagens diferentes no mesmo arquivo.
Exemplos
O exemplo de código a seguir descreve uma implementação de FindConsumer. Na implementação a seguir, suponha que existam dois coletores para receber eventos, um para cada um dos dois filtros de evento registrados diferentes. Para determinar qual coletor FindConsumer envia de volta ao WMI, o código examina o objeto de consumidor lógico de entrada.
HRESULT MyEventConsumerClass::FindConsumer(
/* [in] */ IWbemClassObject __RPC_FAR *pLogicalConsumer,
/* [out] */ IWbemUnboundObjectSink __RPC_FAR *__RPC_FAR *ppConsumer
)
{
// Examine the logical consumer to see which one it is.
// ====================================================
VARIANT v;
VariantInit(&v);
HRESULT hRes = WBEM_E_NOT_FOUND;
*ppConsumer = 0;
pLogicalConsumer->Get(_bstr_t(L"Name"), 0, &v, 0, 0);
// Decide which of the two logical consumers to send back.
// =======================================================
if (_wcsicmp(V_BSTR(&v), L"Consumer1") == 0)
{
//send back the Consumer1 sink to WMI
// For example:
/*hRes = m_pConsumer1->
QueryInterface(IID_IWbemUnboundObjectSink,
(LPVOID*)ppConsumer);*/
}
else if (_wcsicmp(V_BSTR(&v), L"Consumer2") == 0)
{
//send back the Consumer2 sink to WMI
// For example:
/*hRes = m_pConsumer2->
QueryInterface(IID_IWbemUnboundObjectSink,
(LPVOID*)ppConsumer);*/
}
VariantClear(&v);
return hRes;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows Vista |
Servidor mínimo com suporte | Windows Server 2008 |
Plataforma de Destino | Windows |
Cabeçalho | wbemprov.h (include Wbemidl.h) |
Biblioteca | Wbemuuid.lib |
DLL | Wbemsvc.dll |