Freigeben über


Benachrichtigungsdatenobjekt

Die Benachrichtigungsdaten werden als Objekt behandelt, das die IPrintAsyncNotifyDataObject-Schnittstelle verfügbar macht. Clients der Spoolerbenachrichtigungspipeline können ihr eigenes Datenschema definieren und jeden Datentyp hin- und her senden. Der Spooler fragt jedoch das Benachrichtigungsdatenobjekt nach einem BYTE*-Zeiger, der Länge der Daten und dem Benachrichtigungstyp ab. Der Benachrichtigungstyp ist eine GUID, wie unter Benachrichtigungstypen beschrieben.

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

Der Benachrichtigungssender muss die Daten in ein IPrintAsyncNotifyDataObject-Objekt packen . Der Absender muss die IUnknown-Schnittstelle implementieren.

Der lauschende Client ruft die IPrintAsyncNotifyDataObject::AcquireData-Methode auf, um einen unformatierten Zeiger auf die Benachrichtigungsdaten, die Größe der Benachrichtigungsdaten und den Benachrichtigungstyp zu erhalten.

Wenn der lauschende Client mit den Daten fertig ist, muss er die IPrintAsyncNotifyDataObject::ReleaseData-Methode aufrufen. Die Clients der Spoolerbenachrichtigungspipe müssen die IPrintAsyncNotifyDataObject-Schnittstelle so implementieren, dass das Objekt nicht freigegeben wird, wenn die IPrintAsyncNotifyDataObject::Release-Methode aufgerufen wird, bevor die IPrintAsyncNotifyDataObject::ReleaseData-Methode aufgerufen wird. Es wird empfohlen, die Verweisanzahl des Objekts durch einen Aufruf der IPrintAsyncNotifyDataObject::AcquireData-Methode zu erhöhen und die Verweisanzahl des Objekts durch einen Aufruf der ReleaseData-Methode zu verringern.

Der Spooler definiert eine spezielle Benachrichtigungstyp-GUID mit dem Namen NOTIFICATION_RELEASE. Wenn entweder der Spooler oder die lauschende Anwendung stirbt, gibt der Rundowncode das Ende des Kanals "still alive" an, indem die IPrintAsyncNotifyChannel::CloseChannel-Methode aufgerufen wird .

Ein Aufruf der IPrintAsyncNotifyDataObject::AcquireData-Methode für diese Benachrichtigung wird zurückgegeben, wobei der BYTE**-Parameter auf NULL, der ULONG*-Parameter auf 0 und der GUID*-Parameter auf NOTIFICATION_RELEASE festgelegt ist.