Funzione FindNextPrinterChangeNotification

La funzione FindNextPrinterChangeNotification recupera informazioni sulla notifica di modifica più recente per un oggetto di notifica delle modifiche associato a una stampante o a un server di stampa. Chiamare questa funzione quando viene soddisfatta un'operazione di attesa nell'oggetto di notifica delle modifiche.

La funzione reimposta anche l'oggetto di notifica delle modifiche allo stato non segnalato. È quindi possibile usare l'oggetto in un'altra operazione di attesa per continuare a monitorare la stampante o il server di stampa. Il sistema operativo imposta l'oggetto sullo stato segnalato alla successiva volta che si verifica una delle modifiche specificate nella stampante o nel server di stampa. La funzione FindFirstPrinterChangeNotification crea l'oggetto di notifica delle modifiche e specifica il set di modifiche da monitorare.

Sintassi

BOOL FindNextPrinterChangeNotification(
  _In_      HANDLE hChange,
  _Out_opt_ PDWORD pdwChange,
  _In_opt_  LPVOID pPrinterNotifyOptions,
  _Out_opt_ LPVOID *ppPrinterNotifyInfo
);

Parametri

hChange [in]

Handle per un oggetto di notifica di modifica associato a una stampante o a un server di stampa. Si ottiene un handle di questo tipo chiamando la funzione FindFirstPrinterChangeNotification . Il sistema operativo imposta l'oggetto notifica di modifica allo stato segnalato quando rileva una delle modifiche specificate nel filtro di notifica delle modifiche dell'oggetto.

pdwChange [out, facoltativo]

Puntatore a una variabile i cui bit sono impostati per indicare le modifiche che si sono verificate per causare la notifica più recente. I flag di bit che potrebbero essere impostati corrispondono a quelli specificati nel parametro fdwFilter della chiamata FindFirstPrinterChangeNotification . Il sistema imposta uno o più flag di bit seguenti.

Valore Significato
PRINTER_CHANGE_ADD_FORM
Un modulo è stato aggiunto al server.
PRINTER_CHANGE_ADD_JOB
Un processo di stampa è stato inviato alla stampante.
PRINTER_CHANGE_ADD_PORT
Una porta o un monitoraggio è stato aggiunto al server.
PRINTER_CHANGE_ADD_PRINT_PROCESSOR
Un processore di stampa è stato aggiunto al server.
PRINTER_CHANGE_ADD_PRINTER
Una stampante è stata aggiunta al server.
PRINTER_CHANGE_ADD_PRINTER_DRIVER
Un driver della stampante è stato aggiunto al server.
PRINTER_CHANGE_CONFIGURE_PORT
Una porta è stata configurata nel server.
PRINTER_CHANGE_DELETE_FORM
Un modulo è stato eliminato dal server.
PRINTER_CHANGE_DELETE_JOB
È stato eliminato un processo.
PRINTER_CHANGE_DELETE_PORT
Una porta o un monitoraggio è stato eliminato dal server.
PRINTER_CHANGE_DELETE_PRINT_PROCESSOR
Un processore di stampa è stato eliminato dal server.
PRINTER_CHANGE_DELETE_PRINTER
Una stampante è stata eliminata.
PRINTER_CHANGE_DELETE_PRINTER_DRIVER
Un driver della stampante è stato eliminato dal server.
PRINTER_CHANGE_FAILED_CONNECTION_PRINTER
Non è riuscita una connessione della stampante.
PRINTER_CHANGE_SET_FORM
Nel server è stato impostato un modulo.
PRINTER_CHANGE_SET_JOB
È stato impostato un processo.
PRINTER_CHANGE_SET_PRINTER
È stata impostata una stampante.
PRINTER_CHANGE_SET_PRINTER_DRIVER
È stato impostato un driver della stampante.
PRINTER_CHANGE_WRITE_JOB
I dati del processo sono stati scritti.
PRINTER_CHANGE_TIMEOUT
Timeout del processo.
PRINTER_CHANGE_SERVER
Windows 7: si è verificata una modifica nel server.

pPrinterNotifyOptions [in, facoltativo]

Puntatore a una struttura PRINTER_NOTIFY_OPTIONS . Impostare il membro Flag di questa struttura su PRINTER_NOTIFY_OPTIONS_REFRESH, per consentire alla funzione di restituire i dati correnti per tutti i campi delle informazioni della stampante monitorati. La funzione ignora tutti gli altri membri della struttura. Questo parametro può essere NULL.

ppPrinterNotifyInfo [out, facoltativo]

Puntatore a una variabile puntatore che riceve un puntatore a un buffer allocato dal sistema, di sola lettura. Chiamare la funzione FreePrinterNotifyInfo per liberare il buffer al termine dell'operazione. Questo parametro può essere NULL se non sono necessarie informazioni.

Il buffer contiene una struttura PRINTER_NOTIFY_INFO che contiene una matrice di strutture PRINTER_NOTIFY_INFO_DATA . Ogni elemento della matrice contiene informazioni su uno dei campi specificati nel parametro pPrinterNotifyOptions della chiamata FindFirstPrinterChangeNotification. In genere, la funzione fornisce dati solo per i campi modificati per causare la notifica più recente. Tuttavia, se la struttura puntata dal parametro pPrinterNotifyOptions specifica PRINTER_NOTIFY_OPTIONS_REFRESH, la funzione fornisce dati per tutti i campi monitorati.

Se il bit di PRINTER_NOTIFY_INFO_DISCARDED è impostato nel membro Flag della struttura PRINTER_NOTIFY_INFO , si è verificato un overflow o un errore e le notifiche potrebbero essere state perse. In questo caso, non verranno inviate notifiche aggiuntive finché non si effettua una seconda chiamata FindNextPrinterChangeNotification che specifica PRINTER_NOTIFY_OPTIONS_REFRESH.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è un valore diverso da zero.

Se la funzione ha esito negativo, il valore restituito è zero.

Commenti

Nota

Si tratta di una funzione di blocco o sincrona e potrebbe non restituire immediatamente. La velocità con cui questa funzione restituisce dipende da fattori di runtime come lo stato della rete, la configurazione del server di stampa e i fattori di implementazione del driver della stampante difficili da prevedere durante la scrittura di un'applicazione. La chiamata a questa funzione da un thread che gestisce l'interazione con l'interfaccia utente potrebbe rendere l'applicazione non rispondente.

Chiamare la funzione FindNextPrinterChangeNotification dopo un'operazione di attesa su un oggetto di notifica creato da FindFirstPrinterChangeNotification è stato soddisfatto. La chiamata a FindNextPrinterChangeNotification consente di ottenere informazioni sulla modifica che ha soddisfatto l'operazione di attesa e reimposta l'oggetto di notifica in modo che possa essere segnalato quando si verifica la modifica successiva.

Con un'eccezione, non chiamare la funzione FindNextPrinterChangeNotification se l'oggetto di notifica di modifica non è nello stato segnalato. Se una funzione di attesa restituisce il valore WAIT_TIMEOUT, l'oggetto change non si trova nello stato segnalato. Chiamare la funzione FindNextPrinterChangeNotification solo se la funzione di attesa riesce senza timeout. L'eccezione è quando FindNextPrinterChangeNotification viene chiamato con il bit PRINTER_NOTIFY_OPTIONS_REFRESH impostato nel parametro pPrinterNotifyOptions . Si noti che anche quando questo flag è impostato, è comunque possibile impostare il flag PRINTER_NOTIFY_INFO_DISCARDED nel parametro ppPrinterNotifyInfo .

Per continuare a monitorare la stampante o il server di stampa per le modifiche, ripetere il ciclo di chiamata a una delle funzioni di attesa e quindi chiamare la funzione FindNextPrinterChangeNotification per esaminare la modifica e reimpostare l'oggetto di notifica.

FindNextPrinterChangeNotification può combinare più modifiche allo stesso campo delle informazioni sulla stampante in una singola notifica. Quando si verifica questo problema, la funzione comprime in genere tutte le modifiche per il campo in una singola voce nella matrice di strutture PRINTER_NOTIFY_INFO_DATA in ppPrinterNotifyInfo; la voce singola segnala solo le informazioni più aggiornate. Tuttavia, per alcuni campi di informazioni sul processo e sulla stampante, la funzione può restituire più voci di matrice per lo stesso campo. In questo caso, l'ultima voce di matrice per il campo segnala i dati correnti e le voci precedenti contengono i dati per le fasi intermedie.

Quando non è più necessario l'oggetto di notifica di modifica, chiuderlo chiamando la funzione FindClosePrinterChangeNotification .

Nota

In Windows XP con Service Pack 2 (SP2) e versioni successive, Internet Connection Firewall (ICF) blocca le porte della stampante per impostazione predefinita, ma è possibile abilitare un'eccezione per La condivisione file e stampa. Se un utente effettua una connessione stampante a un altro computer e l'eccezione non è abilitata, l'utente non riceverà notifiche di modifica della stampante dal server. Un amministratore del computer dovrà abilitare l'eccezione.

Esempio

Nell'esempio di codice seguente viene illustrato come monitorare lo stato della stampante usando queste funzioni.

// Get change notification handle for the printer   
chgObject = FindFirstPrinterChangeNotification( 
                hPrinter, 
                PRINTER_CHANGE_JOB, 
                0, 
                NULL); 

if (chgObject != INVALID_HANDLE_VALUE) {
    while (bKeepMonitoring) {
        // Wait for the change notification 
        WaitForSingleObject(chgObject, INFINITE);

        fcnreturn = FindNextPrinterChangeNotification(
                        chgObject, 
                        pdwChange, 
                        NULL, 
                        NULL);

        if (fcnreturn) {
            // Check value of *pdwChange and 
            //  deal with the indicated change 
        }
        // Insert some mechanism to stop monitoring
        //  such as: 
        //
        // if (something happens) {
        //     bKeepMonitoring = false; 
        // }
        //
    }
    // Close Printer Change Notification handle when finished. 
    FindClosePrinterChangeNotification(chgObject);
} else {
    // Unable to open printer change notification handle 
    dwStatus = GetLastError();
}

Requisiti

Requisito Valore
Client minimo supportato
Windows 2000 Professional [solo app desktop]
Server minimo supportato
Windows 2000 Server [solo app desktop]
Intestazione
Winspool.h (include Windows.h)
Libreria
Winspool.lib
DLL
Spoolss.dll

Vedi anche

Stampa

Funzioni dell'API spooler di stampa

FindClosePrinterChangeNotification

FindFirstPrinterChangeNotification

PRINTER_NOTIFY_INFO

PRINTER_NOTIFY_INFO_DATA

PRINTER_NOTIFY_OPTIONS