Callback di notifica
Qualsiasi componente di stampa o applicazione in ascolto che è interessato alla ricezione di notifiche deve fornire oggetti che espongono l'interfaccia IPrintAsyncNotifyCallback . L'interfaccia eredita da IUnknown in modo che i client del meccanismo di notifica spooler possano implementare un oggetto COM o C++.
Un'applicazione in ascolto deve fornire un puntatore a un'interfaccia IPrintAsyncNotifyCallback quando registra per ricevere notifiche. Il mittente di notifica deve fornire un puntatore a un'interfaccia IPrintAsyncNotifyCallback se è interessato a una risposta e crea un canale bidirezionale.
#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;
};
Quando viene inviata una notifica da una parte del canale, il servizio spooler chiama il metodo IPrintAsyncNotifyCallback::OnEventNotify all'altra estremità del canale per recapitare la notifica.
Quando il canale di notifica viene chiuso a una sola fine, il servizio spooler chiama il metodo IPrintAsyncNotifyCallback::ChannelClosed all'altra fine per annunciare che il canale è chiuso. Il motivo per la chiusura del canale viene recapitato come notifica.
Se il server o l'applicazione in ascolto muore, il codice di esecuzione del spooler rileva questa condizione e la fine "ancora attiva" del canale che è ancora attiva viene notificata da una chiamata IPrintAsyncNotifyCallback::ChannelClosed , in cui viene recapitato un messaggio di NOTIFICATION_RELEASE.