Återanrop av meddelande

Alla utskriftskomponenter eller lyssnande program som är intresserade av att ta emot meddelanden måste tillhandahålla objekt som exponerar gränssnittet IPrintAsyncNotifyCallback . Gränssnittet ärver från IUnknown så att klienterna i spooler-meddelandemekanismen kan implementera antingen en COM eller ett C++-objekt.

Ett lyssnande program måste ge en pekare till ett IPrintAsyncNotifyCallback-gränssnitt när det registreras för att ta emot meddelanden. Meddelandeavsändaren måste ange en pekare till ett IPrintAsyncNotifyCallback-gränssnitt om den är intresserad av ett svar och skapar en dubbelriktad kanal.

#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;
};

När ett meddelande skickas från ena änden av kanalen anropar spooler-tjänsten IPrintAsyncNotifyCallback::OnEventNotify-metoden i den andra änden av kanalen för att leverera meddelandet.

När meddelandekanalen stängs i ena änden anropar spooler-tjänsten IPrintAsyncNotifyCallback::ChannelClosed-metoden i den andra änden för att meddela att kanalen är stängd. Anledningen till att stänga kanalen levereras som ett meddelande.

Om antingen servern eller det lyssnande programmet dör upptäcker spoolerns nedkörningskod denna situation, och den "fortfarande aktiva" änden av kanalen meddelas genom ett IPrintAsyncNotifyCallback::ChannelClosed-anrop, där ett NOTIFICATION_RELEASE-meddelande levereras.