Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplicativos WMI escritos em C++ podem fazer chamadas assíncronas usando muitos dos métodos do IWbemServices interface COM. No entanto, o procedimento recomendado para chamar um método WMI ou um método de provedor de é usando chamadas semissíncronas, porque as chamadas semissíncronas são mais seguras do que as chamadas assíncronas. Para obter mais informações, consulte Fazendo uma chamada semissíncrona com C++ e Definindo a segurança em uma chamada assíncrona.
O procedimento a seguir descreve como fazer uma chamada assíncrona usando o coletor em seu processo.
Para fazer uma chamada assíncrona usando C++
Implemente a interface IWbemObjectSink .
Todos os aplicativos que fazem chamadas assíncronas devem implementar IWbemObjectSink. Os consumidores de eventos temporários também implementam IWbemObjectSink para receber notificações de eventos.
Faça logon no namespace WMI de destino.
Os aplicativos sempre precisam chamar a função COM CoInitializeSecurity durante a fase de inicialização. Se eles não fizerem isso antes de fazer uma chamada assíncrona, o WMI liberará o coletor do aplicativo sem concluir a chamada assíncrona. Para obter mais informações, consulte inicializando COM para um aplicativo WMI.
Defina a segurança para o lavatório.
As chamadas assíncronas criam uma variedade de problemas de segurança com os quais você pode ter que lidar, por exemplo, permitindo o acesso WMI ao seu aplicativo. Para obter mais informações, consulte Definindo a segurança em uma chamada assíncrona.
Faça a chamada assíncrona.
O método retorna imediatamente com o código de sucesso WBEM_S_NO_ERROR. O aplicativo pode prosseguir com outras tarefas enquanto aguarda a conclusão da operação. O WMI reporta de volta à aplicação chamando métodos na implementação IWbemObjectSink da sua aplicação.
Se necessário, verifique sua implementação periodicamente para atualizações.
Os aplicativos podem receber notificação de status intermediário definindo o parâmetro lFlags na chamada assíncrona como WBEM_FLAG_SEND_STATUS. O WMI relata o estado da sua chamada ao definir o parâmetro lFlags de IWbemObjectSink para WBEM_STATUS_PROGRESS.
Se necessário, você pode cancelar a chamada antes que o WMI termine o processamento chamando o métodoIWbemServices::CancelCallAsync.
O método CancelAsyncCall cancela o processamento assíncrono liberando imediatamente o ponteiro para a interfaceIWbemObjectSink e garante que o ponteiro seja liberado antes que CancelAsyncCall retorne.
Se estiver a utilizar um objeto wrapper que implemente a interface IUnsecured para hospedar IWbemObjectSink, poderá encontrar algumas complicações adicionais. Como a aplicação deve passar o mesmo ponteiro para CancelAsyncCall que foi passado na chamada assíncrona original, a aplicação deve reter o objeto wrapper até ficar claro que o cancelamento não é necessário. Para obter mais informações, consulte Definindo a segurança em uma chamada assíncrona.
Quando terminar, limpe os ponteiros e desligue o aplicativo.
O WMI fornece a chamada de status final por meio do método SetStatus.
Observação
Depois de enviar a atualização de status final, o WMI libera o coletor de objetos chamando o método Release para a classe que implementa a interfaceIWbemObjectSink. No exemplo anterior, este é o método QuerySink::Release. Se quiser ter controle sobre o tempo de vida do objeto do coletor, você pode implementar o coletor com uma contagem de referência inicial de um (1).
Se uma aplicação cliente passar a mesma interface de receção em duas chamadas assíncronas sobrepostas diferentes, o WMI não garante a ordem do retorno de chamada. Uma aplicação cliente que faz chamadas assíncronas sobrepostas deve usar objetos de destino diferentes ou serializar as chamadas.
O exemplo a seguir requer as seguintes instruções de referência e #include.
#include <iostream>
using namespace std;
#pragma comment(lib, "wbemuuid.lib")
#include <wbemidl.h>
O exemplo a seguir descreve como fazer uma consulta assíncrona usando o ExecQueryAsync método, mas não cria configurações de segurança ou libera o IWbemObjectSink objeto. Para obter mais informações, consulte Definindo a segurança em uma chamada assíncrona.
// Set input parameters to ExecQueryAsync.
BSTR QueryLang = SysAllocString(L"WQL");
BSTR Query = SysAllocString(L"SELECT * FROM MyClass");
// Create IWbemObjectSink object and set pointer.
QuerySink *pSink = new QuerySink;
IWbemServices* pSvc = 0;
// Call ExecQueryAsync.
HRESULT hRes = pSvc->ExecQueryAsync(QueryLang,
Query,
0,
NULL,
pSink);
// Check for errors.
if (hRes)
{
printf("ExecQueryAsync failed with = 0x%X\n", hRes);
SysFreeString(QueryLang);
SysFreeString(Query);
delete pSink;
return ERROR;
}
Observação
O código acima não compila sem erro porque a classe QuerySink não foi definida. Para obter mais informações sobre QuerySink, consulte IWbemObjectSink.
Tópicos relacionados