Compartilhar via


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.