Freigeben über


CreatePrintAsyncNotifyChannel-Funktion (prnasnot.h)

Erstellt einen Kommunikationskanal zwischen einer von Print Spooler gehosteten Druckkomponente, z. B. einem Drucktreiber oder Portmonitor, und einer Anwendung, die Benachrichtigungen von der Komponente empfängt.

Syntax

HRESULT CreatePrintAsyncNotifyChannel(
  [in]  PCWSTR                            pszName,
  [in]  PrintAsyncNotificationType        *pNotificationType,
  [in]  PrintAsyncNotifyUserFilter        eUserFilter,
  [in]  PrintAsyncNotifyConversationStyle eConversationStyle,
  [in]  IPrintAsyncNotifyCallback         *pCallback,
  [out] IPrintAsyncNotifyChannel          **ppIAsynchNotification
);

Parameter

[in] pszName

Ein Zeiger auf den Namen eines Druckservers oder einer Druckwarteschlange.

[in] pNotificationType

Ein Zeiger auf die GUID des Datenschemas für den Typ der Benachrichtigungen, die im Kanal gesendet werden sollen.

[in] eUserFilter

Ein Wert, der angibt, ob Benachrichtigungen gesendet werden:

  • Nur Anwendungen, die als derselbe Benutzer wie der vom Print Spooler gehostete Plug-In-Absender ausgeführt werden.
  • Eine breitere Palette von Lauschanwendungen.

[in] eConversationStyle

Ein Wert, der angibt, ob die Kommunikation bidirektional oder unidirektional ist.

[in] pCallback

Ein Zeiger auf ein Objekt, das die lauschende Anwendung verwendet, um die von Print Spooler gehostete Komponente zurückzurufen. Dies sollte NULL sein, wenn die RichtungkUniDirectional ist.

[out] ppIAsynchNotification

Ein Zeiger auf den neuen Kanal.

Rückgabewert

HRESULT Schweregrad Bedeutung
S_OK SUCCESS Die Funktion wurde erfolgreich abgeschlossen.
CHANNEL_ALREADY_OPENED ERROR Der Kanal wurde bereits geöffnet.
MAX_CHANNEL_COUNT_EXCEEDED ERROR Die maximale Anzahl von Lauschanwendungen, die bereits für den angegebenen Benachrichtigungstyp bei der angegebenen Warteschlange oder dem angegebenen Druckserver registriert wurden. Das Standardmaximum ist 10.000.
 

Die Rückgabewerte sind COM-Fehlercodes. Da diese Funktion den Vorgang möglicherweise erfolgreich abgeschlossen hat und dennoch ein anderes HRESULT als S_OK sollten Sie das Makro SUCCEEDED oder FAILED verwenden, um den Erfolg des Aufrufs zu bestimmen. Verwenden Sie das Makro HRESULT_CODE, um das spezifische HRESULT abzurufen, das von der Funktion zurückgegeben wurde.

Das folgende Codebeispiel zeigt, wie diese Makros zum Auswerten des Rückgabewerts verwendet werden können.

if (SUCCEEDED(hr)){
  //Call was successful 
}

if (FAILED(hr)) {
  // Call failed 
}

if (FAILED(hr)) {
  // Call failed 
  switch (HRESULT_CODE(hr)){
    case CHANNEL_ALREADY_OPENED:
      // Some action 
      break;
    case MAX_CHANNEL_COUNT_EXCEEDED:
      // Some action 
      break;
    default:
      //Default action 
      break;
  }
} else {
  //call succeeded 
}

Weitere Informationen zu COM-Fehlercodes finden Sie unter Fehlerbehandlung.

Weitere mögliche Rückgabewerte finden Sie unter PrintAsyncNotifyError .

Hinweise

Hinweis Dies ist eine blockierende oder synchrone Funktion und wird möglicherweise nicht sofort zurückgegeben. Wie schnell diese Funktion zurückgibt, hängt von Laufzeitfaktoren wie Netzwerk-status, Druckserverkonfiguration und Druckertreiberimplementierung ab – Faktoren, die beim Schreiben einer Anwendung schwer vorherzusagen sind. Wenn Sie diese Funktion über einen Thread aufrufen, der die Interaktion mit der Benutzeroberfläche verwaltet, kann die Anwendung nicht reagieren.
 
Eine Komponente kann einen Kanal nur öffnen, wenn sie im Prozess des Druckspoolers ausgeführt wird. Wenn beispielsweise eine Anwendung einen Druckertreiber lädt, kann der Treiber keinen Kanal öffnen, aber ein Druckertreiber, der in der Druckspooler geladen wird, kann einen Kanal öffnen. Lauschendanwendungen können sich innerhalb oder außerhalb des Druckspoolers befinden.

Um einen Kanal zu schließen, rufen Sie IPrintAsyncNotifyChannel::CloseChannel auf. IPrintAsyncNotifyChannel::CloseChannel kann jedoch nicht sofort nach dem Aufruf von CreatePrintAsyncNotifyChannel aufgerufen werden.

Rufen Sie nur IPrintAsyncNotifyChannel::Release() auf:

  1. , wenn es sich um eine explizite Übereinstimmung mit einem früheren IPrintAsyncNotifyChannel::AddRef()-Aufruf handelt.
  2. , wenn es sich bei dem Kanal um einen uniDirektionalen Kanal handelt und Sie den Zeiger verlassen, der in einem erfolgreichen Aufruf von CreatePrintAsyncNotifyChannel empfangen wurde.
  3. , wenn Sie nach dem Erstellen eines BiDirectional-Kanals oder in der Implementierung von IPrintNotifyAsyncCallback::OnEventNotify und:
    1. Sie haben IPrintAsyncNotifyChannel::SendNotification oder IPrintAsyncNotifyChannel::CloseChannel OR nicht aufgerufen.
    2. Sie haben keinen erneuten Aufruf von IPrintAsyncNotifyChannel::SendNotification oder IPrintAsyncNotifyChannel::CloseChannel wiederholt, bei dem ein Fehler ODER aufgetreten ist.
    3. Auf der Serverseite haben Sie keinen erneuten Aufruf von IPrintAsyncNotifyChannel::SendNotification wiederholt, der mit dem Rückgabewert NO_LISTENER OR erfolgreich war.
    4. Auf der Clientseite haben Sie keinen erneuten Aufruf von IPrintAsyncNotifyChannel::SendNotification wiederholt, der mit dem Rückgabewert CHANNEL_ACQUIRED erfolgreich war.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile prnasnot.h
Bibliothek Winspool.lib
DLL Spoolss.dll

Weitere Informationen

Clientidentitätswechsel

Druckspooler-API-Funktionen

Drucken