Поделиться через


Объект данных уведомления

Данные уведомления обрабатываются как объект, предоставляющий интерфейс IPrintAsyncNotifyDataObject . Клиенты канала уведомлений очереди очереди могут определять собственную схему данных и отправлять данные любого типа взад и вперед. Однако очередь очереди запрашивает у объекта данных уведомления указатель BYTE*, длину данных и тип уведомления. Типом уведомления является GUID, как описано в разделе Типы уведомлений.

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

Отправитель уведомления должен упаковать данные в объект IPrintAsyncNotifyDataObject . Отправитель должен реализовать интерфейс IUnknown .

Прослушивающий клиент вызывает метод IPrintAsyncNotifyDataObject::AcquireData , чтобы получить необработанный указатель на данные уведомления, размер данных уведомления и тип уведомления.

После завершения прослушивания данных клиент должен вызвать метод IPrintAsyncNotifyDataObject::ReleaseData . Клиенты конвейера уведомлений очереди очереди должны реализовать интерфейс IPrintAsyncNotifyDataObject таким образом, чтобы при вызове метода IPrintAsyncNotifyDataObject::Release перед вызовом метода IPrintAsyncNotifyDataObject::ReleaseData объект не освобождается. Рекомендуется, чтобы при вызове метода IPrintAsyncNotifyDataObject::AcquireData было увеличено число ссылок объекта, а при вызове метода ReleaseData значение счетчика ссылок объекта уменьшалось.

Очередь очереди определяет специальный GUID типа уведомлений с именем NOTIFICATION_RELEASE. Когда очередь очереди или прослушивающее приложение умирают, код запуска объявляет о том, что конец канала все еще активен, вызывая метод IPrintAsyncNotifyChannel::CloseChannel .

Вызов метода IPrintAsyncNotifyDataObject::AcquireData для этого уведомления возвращается с параметром BYTE** значение NULL, параметр ULONG* имеет значение 0, а параметр GUID* — NOTIFICATION_RELEASE.