Rappel de notification
Tout composant d’impression ou application d’écoute qui souhaite recevoir des notifications doit fournir des objets qui exposent l’interface IPrintAsyncNotifyCallback . L’interface hérite d’IUnknown afin que les clients du mécanisme de notification du spouleur puissent implémenter un objet COM ou C++.
Une application à l’écoute doit fournir un pointeur vers une interface IPrintAsyncNotifyCallback lorsqu’elle s’inscrit pour recevoir des notifications. L’expéditeur de notification doit fournir un pointeur vers une interface IPrintAsyncNotifyCallback s’il est intéressé par une réponse et qu’il crée un canal bidirectionnel.
#define INTERFACE IPrintAsyncNotifyCallback
DECLARE_INTERFACE_(IPrintAsyncNotifyCallback, IUnknown)
{
STDMETHOD(QueryInterface)(
THIS_
REFIID riid,
void** ppvObj
) PURE;
STDMETHOD_(ULONG, AddRef)(
THIS
) PURE;
STDMETHOD_(ULONG, Release)(
THIS
) PURE;
STDMETHOD(OnEventNotify)(
THIS_
IN IPrintAsyncNotifyChannel*,
IN IPrintAsyncNotifyDataObject*
) PURE;
STDMETHOD(ChannelClosed)(
THIS_
IN IPrintAsyncNotifyChannel*,
IN IPrintAsyncNotifyDataObject*
) PURE;
};
Lorsqu’une notification est envoyée à partir d’une extrémité du canal, le service spouleur appelle la méthode IPrintAsyncNotifyCallback::OnEventNotify à l’autre extrémité du canal pour remettre la notification.
Lorsque le canal de notification est fermé à une extrémité, le service spouleur appelle la méthode IPrintAsyncNotifyCallback::ChannelClosed à l’autre extrémité pour annoncer que le canal est fermé. La raison de la fermeture du canal est fournie sous forme de notification.
Si le serveur ou l’application d’écoute meurt, le code d’exécution du spouleur détecte cette condition et l’extrémité « toujours vivante » du canal toujours actif est avertie par un appel IPrintAsyncNotifyCallback::ChannelClosed , dans lequel un message NOTIFICATION_RELEASE est remis.