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.