Como obter o status de uma impressora e um trabalho de impressão

Traduções deste artigo Traduções deste artigo
ID do artigo: 160129 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

O status de impressoras e trabalhos de impressão serão atualizados pelo Spooler Win32 durante despool de um trabalho de impressão. Em todos os outros horários, quando essa impressora não despooling e relatórios não informações de estado, a impressora é considerada pronto e ocioso.

Mais Informações

Como referido pela API do Win32, "impressora" é composta do driver de impressora, a fila de impressão e o caminho de entrada/saída para a impressora física. O sistema operacional trata uma impressora física como simplesmente o destino de um trabalho de impressão gerada pelo e passadas para um sistema "Impressora", mencionado o restante deste artigo como uma impressora.

A parte mais visível de uma impressora é uma fila de impressão. Ela é gerenciada pelo pastas impressora nas interfaces de usuário de estilo do Windows 95 ou o Gerenciador de impressão. O driver de impressora é a interface para a impressora é usada por aplicativos para criar trabalhos de impressão através da impressora DCs. O caminho de E/s para uma impressora consiste em várias camadas do código do sistema culminating com um monitor de porta.

O monitor de porta é a interface para a impressora física do final de fluxo para baixo de um sistema de impressora e é responsável por transferência de dados de um trabalho de impressão em qualquer conexão existe para a impressora física. No caso do bi-direcional impressoras, o monitor de porta seria responsável para a transferência de dados e para a impressora física. Esta conexão e a impressora física, são onde ocorrem erros. É o trabalho do monitor de porta para relatar esses erros.

O spooler não consulta para o estado de uma impressora física à qual uma impressora está conectada. Em vez disso, o estado de uma impressora física determina o êxito de um trabalho de impressão no momento é despooled sobre o monitor de porta. Se ocorrer algum erro nesse processo, o erro é relatado pelo monitor de porta e registrado em informações sobre o status do trabalho de impressão. O spooler, por sua vez, propaga informações de erro razoável para a fila da impressora.

Conseqüentemente, um sistema de impressora relatórios não status quando a fila de impressora está vazia. Nesse estado, a impressora será considerada pronta para aceitar trabalhos de impressão. Isso é uma suposição válida mesmo se a impressora física está em um erro, como estado off-line. O sistema operacional considera a impressora pronta para aceitar trabalhos de impressão, mesmo se, por algum motivo, ele não pode concluir a entrega para a impressora física. Como uma circunstância é considerada um estado de erro no sistema operacional que deve ser tratado pelo usuário. Ele não é considerado um erro reportable para o aplicativo que é permitido para concluir o spool do trabalho de impressão com êxito.

Determinando o estado de uma impressora física

Há um premissa fundamental que deve ser verdadeira para determinar o estado de uma impressora física: o spooler deve ser tentando enviar um trabalho de impressão para a impressora física. Esta é a única vez que o estado da impressora é informado pelo monitor de porta. Além disso, as informações mais significativas podem ser reportadas nos membros de status de uma estrutura JOB_INFO para esse determinado trabalho de impressão porque alguns monitor de porta será ter definido esses valores diretamente.

As estruturas JOB_INFO contém um membro de status e um membro pStatus . Os dois membros contêm informações sobre o status de um trabalho de impressão relatado pelo monitor de porta. Esses dois membros diferem em que o membro de status seja um campo de bits de estados que contém valores predeterminados, enquanto o membro pStatus é um ponteiro para uma seqüência que pode conter qualquer coisa. Esses valores são documentados pelo SDK do Win32 e o arquivo de cabeçalho WinSpool.h. O membro pStatus é definido de algumas vezes, mas não sempre, o como uma seqüência de status descritivo. O conteúdo dessa seqüência de caracteres é definido por cada monitor de porta.

JOB_INFO estruturas são retornadas por duas funções de API: GetJob e EnumJobs. EnumJobs retorna uma matriz de estruturas JOB_INFO sem exigir que a referência de chamador um determinado trabalho na fila de impressora. O trabalho de impressão que está atualmente despooling (impressão) contém as informações de status. Para localizar este trabalho na matriz, pesquise a matriz de estruturas JOB_INFO para localizar o trabalho de impressão cujo status membro tem o conjunto JOB_STATUS_PRINTING bit.

Um método mais fácil de determinar o status da impressora é examinar o membro de status de uma estrutura PRINTER_INFO . Essa estrutura é retornada pela função GetPrinter . Há uma desvantagem dessa abordagem em que não haja nenhum membro de seqüência de caracteres pStatus em uma estrutura PRINTER_INFO que pode fornecer informações de estado mais detalhado ou abrangentes. No entanto, há uma vantagem de modo que um monitor de porta pode definida bits de status da estrutura PRINTER_INFO a alguns de impressora mais extenso. No entanto, observe que o monitor de porta padrão para o Windows não geralmente define mais do que o bit PRINTER_STATUS_ERROR de membro de status da impressora.

Observe que os membros de status de um conjunto de estruturas podem conter informações de estado que não é estritamente relacionadas a impressora física. Por exemplo, o membro de status de estruturas PRINTER_INFO pode ser definido com PRINTER_STATUS_PAUSED ou PRINTER_STATUS_PENDING_DELETION , que são estritamente relevantes para a fila de impressão. Além disso, o membro de status da estrutura JOB_INFO pode conter valores de estado para JOB_STATUS_PAUSED ou JOB_STATUS_DELETING , que são relevantes somente para esse trabalho de impressão específico. Além disso, observe que os trabalhos de impressão podem acumular em uma fila de impressão após eles têm despooled e devem ser deixados com um estado de JOB_STATUS_PRINTED .

Cada uma dessas funções requer um identificador para uma impressora para identificar a impressora desejada. Esse identificador é obtido da função OpenPrinter , que aceita uma cadeia de caracteres que contém o nome da impressora. Esse nome pode ser o nome local da impressora ou um UNC compartilhar nome em uma impressora de rede.

O código de exemplo a seguir demonstra como chamar a função EnumJobs adequadamente para recuperar JOB_INFO estruturas e como chamar a função GetPrinter para recuperar 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;

   }
				
Observação : quando a pool de impressão estiver ativado no Windows NT, pode haver mais de um trabalho de impressão despooling de uma fila de impressora relatará um status. Este código de exemplo não considera que circunstância.

Referências

Para informações adicionais sobre instruções gerais na chamada Win32 Spooler funções, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
158828Como a enumeração de chamada Wind32 Spooler APIs corretamente

Propriedades

ID do artigo: 160129 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 4.1
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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