通知データ オブジェクト
通知データは、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::ReleaseData メソッドが呼び出される前に IPrintAsyncNotifyDataObject::Release メソッドが呼び出される場合、オブジェクトが解放されないように IPrintAsyncNotifyDataObject インターフェイスを実装する必要があります。 IPrintAsyncNotifyDataObject::AcquireData メソッドの呼び出しでは、オブジェクトの参照カウントをインクリメントし、ReleaseData メソッドの呼び出しでオブジェクトの参照カウントを減らしておくことをお勧めします。
スプーラーは、NOTIFICATION_RELEASE という名前の特殊な通知の種類 GUID を定義します。 スプーラーまたはリッスンしているアプリケーションのいずれかが終了すると、ランダウン コードは IPrintAsyncNotifyChannel::CloseChannel メソッドを呼び出すことによって、 チャネルの "まだ有効な" 終了を知らせます。
この通知に対する IPrintAsyncNotifyDataObject::AcquireData メソッドの呼び出しは、BYTE** パラメーターを NULL に設定し、ULONG* パラメーターを 0 に設定し、GUID* パラメーターを NOTIFICATION_RELEASE に設定して返します。