通知数据对象

通知数据作为公开 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::ReleaseData 方法之前调用 了 IPrintAsyncNotifyDataObject::Release 方法 ,则不会释放该对象。 建议对 IPrintAsyncNotifyDataObject::AcquireData 方法的调用递增对象的引用计数,并且对 ReleaseData 方法的调用应减少对象的引用计数。

后台处理程序定义名为 NOTIFICATION_RELEASE 的特殊通知类型 GUID。 当后台处理程序或侦听应用程序终止时,断开代码通过调用 IPrintAsyncNotifyChannel::CloseChannel 方法宣布通道的“仍然处于活动状态”端。

对此通知调用 IPrintAsyncNotifyDataObject::AcquireData 方法将返回,其中 BYTE** 参数设置为 NULL,ULONG* 参数设置为 0,GUID* 参数设置为 NOTIFICATION_RELEASE。