Como obter o estado de uma impressora e uma tarefa de impressão

Traduções de Artigos Traduções de Artigos
Artigo: 160129 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

O estado de impressoras e trabalhos de impressão são actualizados pelo Spooler Win32 durante despool de uma tarefa de impressão. Todas as outras vezes, quando essa impressora não está despooling e relatórios não informações de estado, a impressora é considerada inactivas e preparado.

Mais Informação

Tal como indicado pela API do Win32, "impressora" é composta pelo controlador de impressora, a fila de impressão e o caminho de entrada/saída para a impressora física. O sistema operativo considera uma impressora física como apenas o destino de uma tarefa de impressão gerado pelo e transmitida através do sistema "Impressora" referido o resto deste artigo como uma impressora.

A parte visível mais de uma impressora é uma fila de impressão. É gerido pelo Gestor de impressão ou as pastas de impressora nas interfaces de utilizador Windows 95 estilo de. O controlador de impressora é a interface para a impressora é utilizada por aplicações para criar tarefas de impressão através da impressora DC. O caminho de E/s para uma impressora é constituída por várias camadas de código do sistema culminating com um monitor de porta.

O monitor de porta é a interface para a impressora física no fim da impressora um sistema sequência para baixo e é responsável pela transferência de dados de uma tarefa de impressão através de qualquer ligação existe para a impressora física. No caso de impressoras bidireccionais, o monitor de porta seria responsável pela transferência de dados de e para a impressora física. Esta ligação e a impressora física, são onde ocorrem erros. É a tarefa do monitor de porta para comunicar os erros.

O spooler não consultar o estado de uma impressora física à qual uma impressora está ligada. Em vez disso, o estado da impressora física determina o êxito de uma tarefa de impressão no momento é despooled sobre o monitor de porta. Se ocorrer algum erro neste processo, o erro é comunicado pelo monitor de porta e registado no informações de estado de uma tarefa de impressão. O spooler, por sua vez, propaga informações de erro razoável para a fila da impressora.

Consequentemente, um sistema de impressora sem estado quando comunica a fila de impressora está vazia. Neste estado, a impressora é assumido como pronta para aceitar trabalhos de impressão. Este é um pressuposto válido, mesmo que a impressora física está num erro como, por exemplo, estado offline. O sistema operativo considera que a impressora pronta para aceitar trabalhos de impressão, mesmo se, por alguma razão, não consegue concluir entrega para a impressora física. Tal uma circunstância é considerada um estado de erro no sistema operativo que têm de ser resolvido pelo utilizador. Não será considerada erro referenciável para a aplicação que é permitida para concluir com êxito a colocação em spool da tarefa de impressão.

Determinar o estado de uma impressora física

Existe um premise fundamental que tem de ser VERDADEIRO para determinar o estado da impressora física: o spooler deve estar a tentar enviar uma tarefa de impressão para a impressora física. Esta é a hora apenas que o estado da impressora é comunicado pelo monitor de porta. Além disso, as informações mais significativas poderão ser comunicadas nos membros de estado de uma estrutura JOB_INFO para essa tarefa de impressão específica porque alguns monitor da porta vai ter definido estes valores directamente.

As estruturas JOB_INFO contém um membro de estado e um membro pStatus . Ambos os membros contêm informações de estado de uma tarefa de impressão comunicada o monitor de porta. Estes dois membros diferem no que o membro de estado um campo de bits dos estados que contém valores predeterminados, enquanto o membro pStatus é um apontador para uma cadeia que pode conter praticamente tudo. Estes valores estão documentados por Win32 SDK e o ficheiro de cabeçalho WinSpool.h. O membro pStatus é por vezes, mas não sempre, definido como uma cadeia de estado descritivo. O conteúdo desta cadeia é definido por cada monitor de porta.

JOB_INFO estruturas são devolvidas por duas funções da API: GetJob e EnumJobs. EnumJobs devolve uma matriz de estruturas JOB_INFO sem necessitar que a referência do autor da chamada uma tarefa específica na fila de impressora. A tarefa de impressão que está actualmente despooling (impressão) contém as informações de estado. Para localizar esta tarefa na matriz, procure a matriz de estruturas JOB_INFO para localizar a tarefa de impressão cujo estado membro tem o conjunto JOB_STATUS_PRINTING bit.

Um método mais fácil de determinar o estado da impressora é examinar o membro de estado de uma estrutura PRINTER_INFO . Esta estrutura é devolvida pela função GetPrinter . Existe uma desvantagem a esta abordagem em que não exista nenhum membro de cadeia pStatus numa estrutura PRINTER_INFO que pode fornecer mais as informações de estado detalhadas ou extenso. No entanto, existe uma vantagem em que um monitor de porta pode definir algumas da impressora mais abrangente bits de estado da estrutura PRINTER_INFO . No entanto, Note que o monitor de porta predefinido para o Windows não normalmente define mais do que o bit PRINTER_STATUS_ERROR de membro de estado da impressora.

Note que os membros de estado de um conjunto de estruturas podem conter informações de estado que não está relacionado apenas com a impressora física. Por exemplo, o membro de estado das estruturas de PRINTER_INFO pode ser definido com PRINTER_STATUS_PAUSED ou PRINTER_STATUS_PENDING_DELETION , que são apenas relevantes para a fila de impressão. Além disso, o membro de estado da estrutura JOB_INFO pode conter valores de estado para JOB_STATUS_PAUSED ou JOB_STATUS_DELETING , que são relevantes apenas para essa tarefa de impressão específica. Além disso, tenha em atenção que poderão acumular trabalhos de impressão numa fila de impressão depois de ter despooled e vai ficar com um estado de JOB_STATUS_PRINTED .

Cada uma destas funções requer um identificador para uma impressora para identificar a impressora pretendida. Este identificador é obtido da função OpenPrinter , que aceita uma cadeia que contém o nome da impressora. Este nome pode ser o nome local da impressora ou um UNC partilhar nome a uma impressora de rede.

O código de exemplo seguinte demonstra como chamar a função EnumJobs correctamente para obter JOB_INFO estruturas e como chamar a função GetPrinter obter PRINTER_INFO estruturas:

Código de exemplo

   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 o agrupamento de impressoras estiver activado no Windows NT, poderá existir mais do que uma tarefa de impressão despooling numa fila de impressora que irá reportar um estado. Este código de exemplo não considera que circunstância.

Referências

Para mais informações sobre instruções gerais no chamar funções de spooler de Win32, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
158828Como chamada Wind32 Spooler enumeração API correctamente

Propriedades

Artigo: 160129 - Última revisão: 21 de novembro de 2006 - Revisão: 4.1
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface nas seguintes plataformas
    • Microsoft Windows NT Server 3.51
    • Microsoft Windows NT Server 4.0 Standard Edition
    • Microsoft Windows NT Workstation 3.51
    • Microsoft Windows NT Workstation 4.0 Developer Edition
    • Microsoft Windows 95
Palavras-chave: 
kbmt kbfaq kbhowto KB160129 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 160129

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com