Delen via


Een asynchrone aanroep maken met C++

WMI-toepassingen die zijn geschreven in C++ kunnen asynchrone aanroepen maken met behulp van veel van de methoden van de IWbemServices COM-interface. De aanbevolen procedure voor het aanroepen van een WMI-methode of een providermethode is echter het gebruik van semisynchrone aanroepen omdat semisynchrone aanroepen veiliger zijn dan asynchrone aanroepen. Zie Een semisynchrone aanroep maken met C++ en Beveiliging instellen voor een Asynchrone oproepvoor meer informatie.

In de volgende procedure wordt beschreven hoe u een asynchrone oproep doet met behulp van de 'sink' in uw proces.

Een asynchrone aanroep maken met behulp van C++

  1. Implementeer de IWbemObjectSink interface.

    Alle toepassingen die asynchrone aanroepen maken, moeten IWbemObjectSinkimplementeren. Gebruikers van tijdelijke gebeurtenissen implementeren ook IWbemObjectSink om meldingen van gebeurtenissen te ontvangen.

  2. Meld u aan bij de doel-WMI-naamruimte.

    Toepassingen moeten de COM-functie altijd aanroepen CoInitializeSecurity tijdens de initialisatiefase. Als ze dit niet doen voordat ze een asynchrone aanroep doen, geeft WMI de toepassingssink vrij zonder de asynchrone aanroep te voltooien. Zie COM initialiseren voor een WMI-toepassingvoor meer informatie.

  3. Stel de beveiliging voor uw sink in.

    Asynchrone aanroepen creëren verschillende beveiligingsproblemen waarmee u mogelijk te maken krijgt, zoals het toestaan van WMI-toegang tot uw toepassing. Zie Beveiliging instellen voor een Asynchrone aanroepvoor meer informatie.

  4. Maak de asynchrone aanroep.

    De methode retourneert onmiddellijk met de WBEM_S_NO_ERROR succescode. De toepassing kan doorgaan met andere taken terwijl wordt gewacht tot de bewerking is voltooid. WMI rapporteert terug aan de toepassing door methoden aan te roepen in de IWbemObjectSink implementatie van uw toepassing.

  5. Controleer indien nodig regelmatig uw implementatie op updates.

    Toepassingen kunnen een melding van de tussenliggende status ontvangen door de parameter lFlags in te stellen in de asynchrone aanroep van WBEM_FLAG_SEND_STATUS. WMI rapporteert de status van uw aanroep door de parameter lFlags van IWbemObjectSink- in te stellen op WBEM_STATUS_PROGRESS.

  6. Indien nodig kunt u de aanroep annuleren voordat WMI klaar is met de verwerking door de methode IWbemServices::CancelCallAsync aan te roepen.

    De methode CancelAsyncCall annuleert asynchrone verwerking door de aanwijzer onmiddellijk vrij te geven aan de IWbemObjectSink interface en garandeert dat de aanwijzer wordt vrijgegeven voordat CancelAsyncCall retourneert.

    Als u een wrapper-object gebruikt dat de IUnsecured-interface implementeert om IWbemObjectSink-te hosten, zijn er mogelijk enkele extra complicaties. Omdat de toepassing dezelfde aanwijzer moet doorgeven aan CancelAsyncCall- die is doorgegeven in de oorspronkelijke asynchrone aanroep, moet de toepassing het wrapper-object vasthouden totdat duidelijk wordt dat annulering niet vereist is. Zie Beveiliging instellen voor een Asynchrone aanroepvoor meer informatie.

  7. Wanneer u klaar bent, schoont u aanwijzers op en sluit u de toepassing af.

    WMI biedt de laatste statusoproep via de methode SetStatus.

    Notitie

    Nadat de definitieve statusupdate is verzonden, brengt WMI de objectsink vrij door de methode Release aan te roepen voor de klasse die de IWbemObjectSink-interface implementeert. In het vorige voorbeeld is dit de methode QuerySink::Release. Als u controle wilt hebben over de levensduur van het sinkobject, kunt u de sink implementeren met een initiële referentieaantal van één (1).

     

    Als een clienttoepassing dezelfde sink-interface doorgeeft in twee verschillende overlappende asynchrone aanroepen, garandeert WMI niet de volgorde van de callback. Een clienttoepassing die overlappende asynchrone aanroepen maakt, moet verschillende sinkobjecten doorgeven of de aanroepen serialiseren.

Voor het volgende voorbeeld zijn de volgende referentie- en #include-instructies vereist.

#include <iostream>
using namespace std;
#pragma comment(lib, "wbemuuid.lib")
#include <wbemidl.h>

In het volgende voorbeeld wordt beschreven hoe u een asynchrone query maakt met behulp van de methode ExecQueryAsync, maar geen beveiligingsinstellingen maakt of de IWbemObjectSink object vrijgeeft. Zie Beveiliging instellen voor een Asynchrone aanroepvoor meer informatie.

// 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;
}

Notitie

De bovenstaande code wordt niet zonder fouten gecompileerd omdat de klasse QuerySink niet is gedefinieerd. Zie IWbemObjectSinkvoor meer informatie over QuerySink.

 

een methode aanroepen