Compartilhar via


Objeto Notification Data

Os dados de notificação são tratados como um objeto que expõe a interface IPrintAsyncNotifyDataObject . Os clientes do pipe de notificação do spooler podem definir seu próprio esquema de dados e podem enviar qualquer tipo de dados para frente e para trás. No entanto, o spooler consulta o objeto de dados de notificação para um ponteiro BYTE*, o comprimento dos dados e o tipo de notificação. O tipo de notificação é um GUID, conforme descrito em Tipos de Notificação.

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

O remetente de notificação deve empacotar os dados em um objeto IPrintAsyncNotifyDataObject . O remetente deve implementar a interface IUnknown .

O cliente ouvinte chama o método IPrintAsyncNotifyDataObject::AcquireData para obter um ponteiro bruto para os dados de notificação, o tamanho dos dados de notificação e o tipo de notificação.

Quando o cliente ouvinte terminar com os dados, ele deverá chamar o método IPrintAsyncNotifyDataObject::ReleaseData . Os clientes do pipe de notificação do spooler devem implementar a interface IPrintAsyncNotifyDataObject de forma que, se o método IPrintAsyncNotifyDataObject::Release for chamado antes do método IPrintAsyncNotifyDataObject::ReleaseData ser chamado, o objeto não será liberado. É recomendável que uma chamada para o método IPrintAsyncNotifyDataObject::AcquireData incremente a contagem de referência do objeto e que uma chamada para o método ReleaseData decremente a contagem de referência do objeto.

O spooler define um GUID de tipo de notificação especial chamado NOTIFICATION_RELEASE. Quando o spooler ou o aplicativo de escuta é encerrado, o código de encerramento anuncia o final "ainda ativo" do canal chamando o método IPrintAsyncNotifyChannel::CloseChannel .

Uma chamada para o método IPrintAsyncNotifyDataObject::AcquireData nessa notificação retorna com o parâmetro BYTE** definido como NULL, o parâmetro ULONG* definido como 0 e o parâmetro GUID* definido como NOTIFICATION_RELEASE.