Partager via


Interface IWbemObjectSink

L’interface IWbemObjectSink crée une interface réceptrice qui peut recevoir tous les types de notifications dans le modèle de programmation WMI. Les clients doivent implémenter cette interface pour recevoir à la fois les résultats des méthodes asynchrones d’IWbemServices et des types spécifiques de notifications d’événements. Les fournisseurs utilisent, mais n’implémentent pas cette interface pour fournir des événements et des objets à WMI.

En règle générale, les fournisseurs appellent une implémentation qui leur est fournie par WMI. Dans ce cas, appelez Indicate pour fournir des objets au service WMI. Après cela, appelez SetStatus pour indiquer la fin de la séquence de notification. Vous pouvez également appeler SetStatus pour indiquer les erreurs lorsque le récepteur n’a pas d’objets.

Lors de la programmation de clients asynchrones de WMI, l’utilisateur fournit l’implémentation. WMI appelle les méthodes pour remettre des objets et définir le statut du résultat.

Notes

Si une application cliente passe la même interface réceptrice dans deux appels asynchrones qui se chevauchent, WMI ne garantit pas l’ordre du rappel. Les applications clientes qui effectuent des appels asynchrones qui se chevauchent doivent passer différents objets récepteurs ou sérialiser leurs appels.

Notes

Étant donné que le rappel au récepteur peut ne pas être retourné au même niveau d’authentification que celui requis par le client, il est recommandé d’utiliser une communication semi-synchrone plutôt qu’une communication asynchrone. Pour plus d’informations, consultez Appel d’une méthode.

Membres

L’interface IWbemObjectSink possède les types de membres suivants :

Méthodes

L’interface IWbemObjectSink possède les méthodes suivantes.

Méthode Description
Indiquer Reçoit des objets de notification.
SetStatus Appelé par les sources pour indiquer la fin d’une séquence de notification ou pour envoyer d’autres codes de statut au récepteur.

Notes

Lors de l’implémentation d’un récepteur d’abonnement aux événements (IWbemObjectSink ou IWbemEventSink), n’appelez pas dans WMI à partir des méthodes Indicate ou SetStatus sur l’objet récepteur. Par exemple, l’appel d’IWbemServices::CancelAsyncCall pour annuler le récepteur à partir d’une implémentation d’Indicate peut interférer avec l’état WMI. Pour annuler un abonnement aux événements, définissez un indicateur et appelez IWbemServices::CancelAsyncCall à partir d’un autre thread ou objet. Pour les implémentations qui ne sont pas liées à un récepteur d’événements, telles que les récupérations d’objets, d’énumérations et de requêtes, vous pouvez rappeler WMI.

Les implémentations de récepteur doivent traiter la notification d’événement dans un délai de 100 ms, car le thread WMI qui transmet la notification d’événement ne peut pas effectuer d’autres tâches tant que l’objet récepteur n’a pas terminé le traitement. Si la notification nécessite un traitement important, le récepteur peut utiliser une file d’attente interne pour un autre thread pour gérer le traitement.

Exemples

L’exemple de code suivant est une implémentation simple d’un récepteur d’objets. Cet exemple peut être utilisé avec IWbemServices::ExecQueryAsync ou IWbemServices::CreateInstanceEnumAsync pour recevoir les instances retournées :

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

class QuerySink : public IWbemObjectSink
{
    LONG m_lRef;
    bool bDone; 

public:
    QuerySink() { m_lRef = 0; }
   ~QuerySink() { bDone = TRUE; }

    virtual ULONG STDMETHODCALLTYPE AddRef();
    virtual ULONG STDMETHODCALLTYPE Release();        
    virtual HRESULT STDMETHODCALLTYPE 
        QueryInterface(REFIID riid, void** ppv);

    virtual HRESULT STDMETHODCALLTYPE Indicate( 
            /* [in] */
            LONG lObjectCount,
            /* [size_is][in] */
            IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray
            );
        
    virtual HRESULT STDMETHODCALLTYPE SetStatus( 
            /* [in] */ LONG lFlags,
            /* [in] */ HRESULT hResult,
            /* [in] */ BSTR strParam,
            /* [in] */ IWbemClassObject __RPC_FAR *pObjParam
            );
};


ULONG QuerySink::AddRef()
{
    return InterlockedIncrement(&m_lRef);
}

ULONG QuerySink::Release()
{
    LONG lRef = InterlockedDecrement(&m_lRef);
    if(lRef == 0)
        delete this;
    return lRef;
}

HRESULT QuerySink::QueryInterface(REFIID riid, void** ppv)
{
    if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
    {
        *ppv = (IWbemObjectSink *) this;
        AddRef();
        return WBEM_S_NO_ERROR;
    }
    else return E_NOINTERFACE;
}


HRESULT QuerySink::Indicate(long lObjCount, IWbemClassObject **pArray)
{
    for (long i = 0; i < lObjCount; i++)
    {
        IWbemClassObject *pObj = pArray[i];

        // ... use the object.

        // AddRef() is only required if the object will be held after
        // the return to the caller.
    }

    return WBEM_S_NO_ERROR;
}

HRESULT QuerySink::SetStatus(
            /* [in] */ LONG lFlags,
            /* [in] */ HRESULT hResult,
            /* [in] */ BSTR strParam,
            /* [in] */ IWbemClassObject __RPC_FAR *pObjParam
        )
{
    printf("QuerySink::SetStatus hResult = 0x%X\n", hResult);
    return WBEM_S_NO_ERROR;
}

Spécifications

Condition requise Valeur
Client minimal pris en charge
Windows Vista
Serveur minimal pris en charge
Windows Server 2008
En-tête
Wbemcli.h (inclut Wbemidl.h)
Bibliothèque
Wbemuuid.lib
DLL
Fastprox.dll

Voir aussi

API COM pour WMI

Appel asynchrone avec C++

Définition de la sécurité sur un appel asynchrone

Réception d’événements pendant la durée de votre application