通知数据对象
通知数据作为公开 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。