Retorno de chamada de notificação
Qualquer componente de impressão ou aplicativo de escuta interessado em receber notificações deve fornecer objetos que expõem a interface IPrintAsyncNotifyCallback . A interface herda de IUnknown para que os clientes do mecanismo de notificação do spooler possam implementar um objeto COM ou C++.
Um aplicativo de escuta deve fornecer um ponteiro para uma interface IPrintAsyncNotifyCallback quando ele se registra para receber notificações. O remetente de notificação deve fornecer um ponteiro para uma interface IPrintAsyncNotifyCallback se estiver interessado em uma resposta e criar um canal bidirecional.
#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 uma notificação é enviada de uma extremidade do canal, o serviço spooler chama o método IPrintAsyncNotifyCallback::OnEventNotify na outra extremidade do canal para entregar a notificação.
Quando o canal de notificação é fechado em uma extremidade, o serviço spooler chama o método IPrintAsyncNotifyCallback::ChannelClosed na outra extremidade para anunciar que o canal está fechado. O motivo para fechar o canal é entregue como uma notificação.
Se o servidor ou o aplicativo de escuta morrer, o código de rundown do spooler detectará essa condição e o final "ainda ativo" do canal que ainda está ativo será notificado por uma chamada IPrintAsyncNotifyCallback::ChannelClosed , na qual uma mensagem de NOTIFICATION_RELEASE é entregue.