Objet de données de notification
Les données de notification sont gérées comme un objet qui expose l’interface IPrintAsyncNotifyDataObject . Les clients du canal de notification du spouleur peuvent définir leur propre schéma de données et envoyer n’importe quel type de données. Toutefois, le spouleur interroge l’objet de données de notification pour un pointeur BYTE*, la longueur des données et le type de notification. Le type de notification est un GUID, comme décrit dans Types de notification.
#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;
};
L’expéditeur de la notification doit emballer les données dans un objet IPrintAsyncNotifyDataObject . L’expéditeur doit implémenter l’interface IUnknown .
Le client d’écoute appelle la méthode IPrintAsyncNotifyDataObject::AcquireData pour obtenir un pointeur brut vers les données de notification, la taille des données de notification et le type de notification.
Lorsque le client d’écoute a terminé avec les données, il doit appeler la méthode IPrintAsyncNotifyDataObject::ReleaseData . Les clients du canal de notification du spouleur doivent implémenter l’interface IPrintAsyncNotifyDataObject de telle sorte que si la méthode IPrintAsyncNotifyDataObject::Release est appelée avant l’appel de la méthode IPrintAsyncNotifyDataObject::ReleaseData , l’objet n’est pas libéré. Il est recommandé qu’un appel à la méthode IPrintAsyncNotifyDataObject::AcquireData incrémente le nombre de références de l’objet et qu’un appel à la méthode ReleaseData décrémente le nombre de références de l’objet.
Le spouleur définit un GUID de type de notification spécial nommé NOTIFICATION_RELEASE. Lorsque le spouleur ou l’application d’écoute meurt, le code d’exécution annonce la fin « toujours vivante » du canal en appelant la méthode IPrintAsyncNotifyChannel::CloseChannel .
Un appel à la méthode IPrintAsyncNotifyDataObject::AcquireData par rapport à cette notification retourne avec le paramètre BYTE** défini sur NULL, le paramètre ULONG* défini sur 0 et le paramètre GUID* défini sur NOTIFICATION_RELEASE.