Al momento sei offline in attesa che la connessione Internet venga ristabilita

Come ottenere lo stato di una stampante e un processo di stampa

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

160129
Sommario
Lo stato dei processi di stampa e stampanti vengono aggiornati mediante il Spoolerduring di Win32 despool di un processo di stampa. A tutti gli altri casi, quando tale stampante isnot despooling e i report informazioni sullo stato, la stampante non sono consideredto essere pronto e inattive.
Informazioni
Di cui l'API di Win32, una "stampante" è costituita il printerdriver, la coda di stampa e il percorso di input/output alla stampante fisica.Il sistema operativo considera una stampante fisica come semplicemente il destinazione ofa processo di stampa generato da e passati tramite un sistema "Stampante", di cui toin il resto di questo articolo come una stampante.

La parte più visibile di una stampante è una coda di stampa. Gestito da thePrint Manager o le cartelle della stampante in userinterfaces il formato Windows 95. Il driver della stampante è l'interfaccia per la stampante è usedby applicazioni per creare processi di stampa tramite stampanti controller di dominio. Il percorso dei / o per aPrinter è composto da più strati di codice di sistema che si concludono con un portmonitor.

Il monitor della porta è l'interfaccia per la stampante fisica alla fine a valle di un sistema di stampante ed è responsabile per il trasferimento di un processo di stampa dataof oltre esiste indipendentemente dalla connessione alla stampante fisica.Nel caso di stampanti bidirezionali, il monitor della porta sarebbe beresponsible per il trasferimento di dati da e verso la stampante fisica. Sono Thisconnection e la stampante fisica, dove si verificano errori. È il jobof il monitor della porta per segnalare gli errori.

Lo Spooler non esegue la query per lo stato di una stampante fisica a cui è connesso aPrinter. Al contrario, lo stato di successo determinesthe stampante fisica di un processo di stampa al momento è despooled attraverso il portmonitor. Se si verifica un errore in questo processo, l'errore viene segnalato dal monitor theport e registrato nelle informazioni sullo stato del processo di stampa. Lo Spooler, a sua volta, propaga le informazioni di errore ragionevole per la coda di stampa.

Di conseguenza, un sistema di stampante non segnala stato quando la funzione isempty della coda della stampante. In questo stato, la stampante presuppone pronta per accettare i processi di stampa.Questo è un presupposto valido anche se la stampante sia in un errorstate come non in linea. Il sistema operativo considera il toaccept pronto stampante i processi di stampa, anche se per qualche motivo non riesce a completare il recapito alla stampante fisica. Tale circostanza è considerata uno stato di errore nel sistema operativo che devono essere affrontato dall'utente. Notconsidered è un errore reportable all'applicazione è consentito tocomplete lo spooling del processo di stampa correttamente.

Determinazione dello stato di una stampante fisica

Non vi è un presupposto fondamentale che deve essere true per determinare la stateof una stampante fisica: lo Spooler necessario tentando di inviare una stampa jobto la stampante fisica. Questo è l'unico caso in cui monitorare lo stato di isreported la stampante dalla porta. Inoltre, la informationmay più significativi riportati in membri di stato di una struttura JOB_INFO per quel particolare processo di stampa perché alcuni monitor della porta sarà necessario impostare questi valori direttamente.

Le strutture JOB_INFO contengono lo stato membro e membro pStatus . Entrambi i membri contengono informazioni sullo stato di un processo di stampa riportato dal monitor della porta. Questi due membri differiscono in quanto stato membro è un campo di bit degli Stati che contiene valori predeterminati, mentre il membro pStatus è un puntatore a una stringa che può contenere qualsiasi. Questi valori vengono documentati mediante il SDK di Win32 e il file di intestazione WinSpool.h. Il membro pStatus è a volte, ma non sempre impostato su una stringa di stato descrittivo. Il contenuto di questa stringa è definito per ogni monitor della porta.

Strutture JOB_INFO restituite da due funzioni API: GetJob ed EnumJobs. EnumJobs restituisce una matrice di strutture JOB_INFO senza che sia necessario il riferimento al chiamante un particolare processo nella coda di stampa. Il processo di stampa è attualmente despooling (stampa) contiene le informazioni sullo stato. Per trovare questo processo nella matrice, ricerca nella matrice di strutture JOB_INFO per individuare il processo di stampa cui membro di stato è impostato il bit di JOB_STATUS_PRINTING.

Un metodo più semplice per determinare lo stato della stampante è possibile esaminare il Statusmember di una struttura PRINTER_INFO . Questa struttura è restituita dalla funzione GetPrinter . Non esiste uno svantaggio di questo approccio in quanto non esiste alcun membro della stringa pStatus in una struttura PRINTER_INFO che potrebbe fornire informazioni di stato più dettagliata o estesa. Tuttavia, è un vantaggio in quanto un monitor della porta è possibile impostare alcune della stampante più ampia bit di stato della struttura PRINTER_INFO . Si noti che il monitor di porta predefinito per Windows non in genere impostato oltre il bit PRINTER_STATUS_ERROR del membro di stato della stampante.

Si noti che i membri di stato di uno dei due set di strutture possono contenere stateinformation non è strettamente correlata alla stampante fisica. Ad esempio, può essere impostato il membro di stato delle strutture PRINTER_INFO con PRINTER_STATUS_PAUSED o PRINTER_STATUS_PENDING_DELETION, che sono significative solo per la coda di stampa. Inoltre, il membro di stato della struttura JOB_INFO può contenere i valori dello stato per JOB_STATUS_PAUSED o JOB_STATUS_DELETING, che sono rilevanti solo per quel particolare processo di stampa. Si noti inoltre che i processi di stampa possono accumularsi in una coda di stampa dopo avere despooled e verrà lasciate nello stato di JOB_STATUS_PRINTED.

Ciascuna di queste funzioni richiede un handle per una stampante per identificare il thedesired della stampante. Questo handle viene ottenuto dalla funzione OpenPrinter , che accetta una stringa contenente il nome della stampante. Questo nome può essere il nome locale della stampante o un percorso UNC condividono il nome di una stampante di rete.

Il codice di esempio riportato di seguito viene illustrato come chiamare la funzione EnumJobs correttamente per recuperare strutture JOB_INFO e come chiamare la funzione GetPrinter per recuperare PRINTER_INFO strutture:

Codice di esempio

   BOOL GetJobs(HANDLE hPrinter,        /* Handle to the printer. */                 JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */                 int *pcJobs,            /* Count of jobs filled.  */                 DWORD *pStatus)         /* Print Queue status.    */    {   DWORD               cByteNeeded,                        nReturned,                        cByteUsed;    JOB_INFO_2          *pJobStorage = NULL;    PRINTER_INFO_2       *pPrinterInfo = NULL;   /* Get the buffer size needed. */        if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))       {           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)               return FALSE;       }       pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);       if (!(pPrinterInfo))           /* Failure to allocate memory. */            return FALSE;       /* Get the printer information. */        if (!GetPrinter(hPrinter,               2,               (LPSTR)pPrinterInfo,               cByteNeeded,               &cByteUsed))       {           /* Failure to access the printer. */            free(pPrinterInfo);           pPrinterInfo = NULL;           return FALSE;       }       /* Get job storage space. */        if (!EnumJobs(hPrinter,               0,               pPrinterInfo->cJobs,               2,               NULL,               0,               (LPDWORD)&cByteNeeded,               (LPDWORD)&nReturned))       {           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)           {               free(pPrinterInfo);               pPrinterInfo = NULL;               return FALSE;           }       }       pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);       if (!pJobStorage)       {           /* Failure to allocate Job storage space. */            free(pPrinterInfo);           pPrinterInfo = NULL;           return FALSE;       }       ZeroMemory(pJobStorage, cByteNeeded);       /* Get the list of jobs. */        if (!EnumJobs(hPrinter,               0,               pPrinterInfo->cJobs,               2,               (LPBYTE)pJobStorage,               cByteNeeded,               (LPDWORD)&cByteUsed,               (LPDWORD)&nReturned))       {           free(pPrinterInfo);           free(pJobStorage);           pJobStorage = NULL;           pPrinterInfo = NULL;           return FALSE;       }       /*        *  Return the information.        */        *pcJobs = nReturned;       *pStatus = pPrinterInfo->Status;       *ppJobInfo = pJobStorage;       free(pPrinterInfo);       return TRUE;   }   BOOL IsPrinterError(HANDLE hPrinter)   {       JOB_INFO_2  *pJobs;       int         cJobs,                   i;       DWORD       dwPrinterStatus;       /*        *  Get the state information for the Printer Queue and        *  the jobs in the Printer Queue.        */        if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))			return FALSE;       /*        *  If the Printer reports an error, believe it.        */        if (dwPrinterStatus &           (PRINTER_STATUS_ERROR |           PRINTER_STATUS_PAPER_JAM |           PRINTER_STATUS_PAPER_OUT |           PRINTER_STATUS_PAPER_PROBLEM |           PRINTER_STATUS_OUTPUT_BIN_FULL |           PRINTER_STATUS_NOT_AVAILABLE |           PRINTER_STATUS_NO_TONER |           PRINTER_STATUS_OUT_OF_MEMORY |           PRINTER_STATUS_OFFLINE |           PRINTER_STATUS_DOOR_OPEN))       {           free( pJobs );           return TRUE;       }       /*        *  Find the Job in the Queue that is printing.        */        for (i=0; i < cJobs; i++)       {           if (pJobs[i].Status & JOB_STATUS_PRINTING)           {               /*                *  If the job is in an error state,                *  report an error for the printer.                *  Code could be inserted here to                *  attempt an interpretation of the                *  pStatus member as well.                */                if (pJobs[i].Status &                   (JOB_STATUS_ERROR |                   JOB_STATUS_OFFLINE |                   JOB_STATUS_PAPEROUT |                   JOB_STATUS_BLOCKED_DEVQ))               {                   free( pJobs );                   return TRUE;               }           }       }       /*        *  No error condition.        */        free( pJobs );       return FALSE;   }				
Nota: quando è attivato il pool di stampa in Windows NT, potrebbe non essere più di un processo di stampa despooling da una coda di stampa che verrà segnalato lo stato. Questo esempio di codice non prende in considerazione tale circostanza.
Riferimenti
Per ulteriori informazioni sulle istruzioni di carattere generale sulla chiamata di funzioni Win32 Spooler, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base:
158828 Come API di enumerazione Spooler Wind32 chiamata correttamente
GdiSpool

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 160129 - Ultima revisione: 03/14/2015 06:57:00 - Revisione: 5.0

  • Microsoft Win32 Application Programming Interface
  • kbFAQ kbhowto kbmt KB160129 KbMtit
Feedback