Condividi tramite


Oggetto dati di notifica

I dati di notifica vengono gestiti come oggetto che espone l'interfaccia IPrintAsyncNotifyDataObject . I client della pipe di notifica dello spooler possono definire il proprio schema di dati e possono inviare qualsiasi tipo di dati avanti e indietro. Tuttavia, lo spooler esegue una query sull'oggetto dati di notifica per un puntatore BYTE*, la lunghezza dei dati e il tipo di notifica. Il tipo di notifica è un GUID, come descritto in Tipi di notifica.

#define INTERFACE IPrintAsyncNotifyDataObject
DECLARE_INTERFACE_(IPrintAsyncNotifyDataObject, IUnknown)
{
    STDMETHOD(QueryInterface)(
        THIS_
        REFIID riid,
        void** ppvObj
        ) PURE;

    STDMETHOD_(ULONG, AddRef)(
        THIS
        ) PURE;

    STDMETHOD_(ULONG, Release)(
        THIS
        ) PURE;

    STDMETHOD(AcquireData)(
         THIS_
         OUT BYTE**,
         OUT ULONG*,
         OUT PrintAsyncNotificationType**
         ) PURE;

    STDMETHOD(ReleaseData)(
        THIS
        ) PURE;
};

Il mittente della notifica deve comprimere i dati in un oggetto IPrintAsyncNotifyDataObject . Il mittente deve implementare l'interfaccia IUnknown .

Il client in ascolto chiama il metodo IPrintAsyncNotifyDataObject::AcquireData per ottenere un puntatore non elaborato ai dati di notifica, le dimensioni dei dati di notifica e il tipo di notifica.

Al termine dell'ascolto dei dati, il client di ascolto deve chiamare il metodo IPrintAsyncNotifyDataObject::ReleaseData . I client della pipe di notifica dello spooler devono implementare l'interfaccia IPrintAsyncNotifyDataObject in modo che, se il metodo IPrintAsyncNotifyDataObject::Release viene chiamato prima che venga chiamato il metodo IPrintAsyncNotifyDataObject::ReleaseData , l'oggetto non viene rilasciato. È consigliabile che una chiamata al metodo IPrintAsyncNotifyDataObject::AcquireData incrementi il conteggio dei riferimenti dell'oggetto e che una chiamata al metodo ReleaseData debba decrementare il conteggio dei riferimenti dell'oggetto.

Lo spooler definisce un GUID di tipo di notifica speciale denominato NOTIFICATION_RELEASE. Quando lo spooler o l'applicazione in ascolto muore, il codice rundown annuncia la fine del canale "still alive" chiamando il metodo IPrintAsyncNotifyChannel::CloseChannel .

Una chiamata al metodo IPrintAsyncNotifyDataObject::AcquireData su questa notifica restituisce con il parametro BYTE** impostato su NULL, il parametro ULONG* impostato su 0 e il parametro GUID* impostato su NOTIFICATION_RELEASE.