Benachrichtigungsrückruf
Jede Druckkomponente oder Lauschanwendung, die am Empfangen von Benachrichtigungen interessiert ist, muss Objekte bereitstellen, die die IPrintAsyncNotifyCallback-Schnittstelle verfügbar machen. Die Schnittstelle erbt von IUnknown , sodass die Clients des Spoolerbenachrichtigungsmechanismus entweder ein COM- oder ein C++-Objekt implementieren können.
Eine lauschende Anwendung muss einen Zeiger auf eine IPrintAsyncNotifyCallback-Schnittstelle bereitstellen, wenn sie sich für den Empfang von Benachrichtigungen registriert. Der Absender der Benachrichtigung muss einen Zeiger auf eine IPrintAsyncNotifyCallback-Schnittstelle bereitstellen, wenn er an einer Antwort interessiert ist und einen bidirektionalen Kanal erstellt.
#define INTERFACE IPrintAsyncNotifyCallback
DECLARE_INTERFACE_(IPrintAsyncNotifyCallback, IUnknown)
{
STDMETHOD(QueryInterface)(
THIS_
REFIID riid,
void** ppvObj
) PURE;
STDMETHOD_(ULONG, AddRef)(
THIS
) PURE;
STDMETHOD_(ULONG, Release)(
THIS
) PURE;
STDMETHOD(OnEventNotify)(
THIS_
IN IPrintAsyncNotifyChannel*,
IN IPrintAsyncNotifyDataObject*
) PURE;
STDMETHOD(ChannelClosed)(
THIS_
IN IPrintAsyncNotifyChannel*,
IN IPrintAsyncNotifyDataObject*
) PURE;
};
Wenn eine Benachrichtigung von einem Ende des Kanals gesendet wird, ruft der Spoolerdienst die IPrintAsyncNotifyCallback::OnEventNotify-Methode am anderen Ende des Kanals auf, um die Benachrichtigung zu übermitteln.
Wenn der Benachrichtigungskanal an einem Ende geschlossen wird, ruft der Spoolerdienst am anderen Ende die IPrintAsyncNotifyCallback::ChannelClosed-Methode auf, um anzukündigen, dass der Kanal geschlossen wird. Der Grund für das Schließen des Kanals wird als Benachrichtigung übermittelt.
Wenn entweder der Server oder die lauschende Anwendung stirbt, erkennt der Spooler-Rundowncode diese Bedingung, und das "noch aktive" Ende des kanals, der noch aktiv ist, wird durch einen IPrintAsyncNotifyCallback::ChannelClosed-Aufruf benachrichtigt, in dem eine NOTIFICATION_RELEASE Nachricht übermittelt wird.