Condividi tramite


Funzione CreatePrintAsyncNotifyChannel (prnasnot.h)

Crea un canale di comunicazione tra un componente di stampa ospitato da Spooler di stampa, ad esempio un driver di stampa o un monitor porta, e un'applicazione che riceve notifiche dal componente.

Sintassi

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

Parametri

[in] pszName

Puntatore al nome di un server di stampa o di una coda di stampa.

[in] pNotificationType

Puntatore al GUID dello schema dei dati per il tipo di notifiche da inviare nel canale.

[in] eUserFilter

Valore che specifica se le notifiche verranno inviate a:

  • Solo le applicazioni in esecuzione con lo stesso utente del mittente del plug-in ospitato da Spooler di stampa.
  • Un set più ampio di applicazioni in ascolto.

[in] eConversationStyle

Valore che specifica se la comunicazione è bidirezionale o unidirezionale.

[in] pCallback

Puntatore a un oggetto che verrà usato dall'applicazione in ascolto per richiamare il componente ospitato dallo Spooler di stampa. Deve essere NULL se la direzionalità è kUniDirectional.

[out] ppIAsynchNotification

Puntatore al nuovo canale.

Valore restituito

HRESULT Gravità Significato
S_OK SUCCESS La funzione è stata completata correttamente.
CHANNEL_ALREADY_OPENED ERRORE Il canale è già stato aperto.
MAX_CHANNEL_COUNT_EXCEEDED ERRORE Il numero massimo di applicazioni in ascolto è già registrato per il tipo di notifica specificato con la coda o il server di stampa specificato. Il valore massimo predefinito è 10.000.
 

I valori restituiti sono codici di errore COM. Poiché questa funzione potrebbe completare correttamente l'operazione ma restituisce un VALORE HRESULT diverso da S_OK è consigliabile utilizzare la macro SUCCEEDED o FAILED per determinare l'esito positivo della chiamata. Per ottenere l'HRESULT specifico restituito dalla funzione, usare la macro HRESULT_CODE.

Nell'esempio di codice seguente viene illustrato come utilizzare queste macro per valutare il valore restituito.

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 
}

Per altre informazioni sui codici di errore COM, vedere Gestione degli errori.

Per altri valori restituiti possibili, vedere PrintAsyncNotifyError .

Commenti

Nota Si tratta di una funzione di blocco o sincrona e potrebbe non restituire immediatamente. La velocità di restituzione di questa funzione dipende da fattori di runtime, ad esempio lo stato della rete, la configurazione del server di stampa e l'implementazione del driver della stampante, fattori difficili da prevedere durante la scrittura di un'applicazione. Chiamando questa funzione da un thread che gestisce l'interazione con l'interfaccia utente, l'applicazione potrebbe sembrare non rispondente.
 
Un componente può aprire un canale solo se viene eseguito nel processo dello Spooler di stampa. Ad esempio, se un'applicazione carica un driver della stampante, il driver non può aprire un canale, ma un driver della stampante caricato all'interno dello Spooler di stampa può aprire un canale. Le applicazioni in ascolto possono trovarsi all'interno o all'esterno del processo di Print Spooler.

Per chiudere un canale, chiamare IPrintAsyncNotifyChannel::CloseChannel; Tuttavia, IPrintAsyncNotifyChannel::CloseChannel non può essere chiamato immediatamente dopo la chiamata a CreatePrintAsyncNotifyChannel.

Chiamare solo IPrintAsyncNotifyChannel::Release():

  1. se si tratta di una corrispondenza esplicita con una chiamata IPrintAsyncNotifyChannel::AddRef() precedente.
  2. se il canale è un canale UniDirectional e si sta abbandonando il puntatore ricevuto in una chiamata riuscita a CreatePrintAsyncNotifyChannel.
  3. se, dopo aver creato un canale BiDirectional o nell'implementazione di IPrintNotifyAsyncCallback::OnEventNotify e:
    1. non è stato chiamato IPrintAsyncNotifyChannel::SendNotification o IPrintAsyncNotifyChannel::CloseChannel OR
    2. non è stata ritentata una chiamata a IPrintAsyncNotifyChannel::SendNotification o IPrintAsyncNotifyChannel::CloseChannel non riuscita
    3. sul lato server non è stata ritentata una chiamata a IPrintAsyncNotifyChannel::SendNotification riuscita con il valore restituito NO_LISTENER OR
    4. sul lato client non è stata ritentata una chiamata a IPrintAsyncNotifyChannel::SendNotification riuscita con il valore restituito CHANNEL_ACQUIRED.

Requisiti

Requisito Valore
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione prnasnot.h
Libreria Winspool.lib
DLL Spoolss.dll

Vedi anche

Rappresentazione client

Funzioni dell'API spooler di stampa

Stampa