DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 160129 - Última revisão: sábado, 14 de março de 2015 - Revisão: 5.0

 

Nesta página

Sumário

O status de impressoras e trabalhos de impressão são atualizados pelo Spoolerduring do Win32 despool de um trabalho de impressão. Em todos os outros horários, quando essa impressora isnot despooling e relatórios sem informações de estado, a impressora serão consideredto estar pronto e ociosas.

Mais Informações

Conforme referido pela API do Win32, "impressora" é composta de printerdriver, 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 apenas o destino integridadede um trabalho de impressão gerado por e passado através de um sistema "Impressora", chamado toin o restante deste artigo como uma impressora.

A parte mais visível de uma impressora é uma fila de impressão. Ele é gerenciado pelo Gerenciador de thePrint ou as pastas de impressora no userinterfaces estilo do Windows 95. O driver de impressora é a interface para a impressora é aplicativos de usedby para criar trabalhos de impressão através da impressora DCs. O caminho de i/o de aPrinter consiste em várias camadas de código do sistema culminando com um portmonitor.

O monitor de porta é a interface para a impressora física no final de um sistema de impressora para baixo fluxo e é responsável pela transferência de dataof um trabalho de impressão em qualquer conexão existe para a impressora física.No caso de impressoras bidirecionais, o monitor de porta seria beresponsible para a transferência de dados de e para a impressora física. Thisconnection e a impressora física, são onde os erros ocorrem. É a jobof o monitor de porta para relatar esses erros.

O Spooler não consultar o estado de uma impressora física à qual está conectado o aPrinter. Em vez disso, o estado de sucesso determinesthe impressora física de um trabalho de impressão no momento em que ele está despooled sobre o portmonitor. Se ocorrer algum erro nesse processo, o erro é relatado pelo monitor de theport e gravado nas informações de status de um trabalho de impressão. O Spooler, por sua vez, propaga informações de erro razoável para a fila de impressão.

Conseqüentemente, um sistema de impressora não relata nenhum status quando isempty na fila da impressora. 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 errorstate como off-line. O sistema operacional considera o toaccept pronto impressora trabalhos de impressão mesmo se, por algum motivo, ele não pode concluir o envio para a impressora física. Essa circunstância é considerada um estado de erro no sistema operacional que deve ser tratado pelo usuário. É notconsidered um erro reportable para o aplicativo que é permitido o spool do trabalho de impressão de tocomplete com êxito.

Determinando o estado de uma impressora física

Há uma premissa fundamental que deve ser verdadeira para determinar a stateof uma impressora física: o Spooler deve estar tentando enviar um job de impressão: para programar a impressora física. Esta é a única vez que monitorar o estado do isreported a impressora pela porta. Além disso, o mais significativo informationmay ser reportado em membros o status de uma estrutura JOB_INFO para esse determinado trabalho de impressão porque alguns monitor de porta tiver definirá esses valores diretamente.

As estruturas JOB_INFO contém um membro de Status e pStatus . Ambos os membros contêm informações de status de um trabalho de impressão relatado pelo monitor de porta. Esses dois membros diferem em que o membro de Status é um campo de bits dos estados que contém valores predeterminados, enquanto o membro pStatus é um ponteiro para uma seqüência de caracteres que pode conter praticamente qualquer coisa. Esses valores estão documentados no SDK do Win32 e o arquivo de cabeçalho WinSpool.h. O membro pStatus é às vezes, mas não sempre, definido como uma seqüência de caracteres descritiva de status. 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 a necessidade de que a referência do chamador um determinado trabalho na fila da impressora. O trabalho de impressão é atualmente despooling (impressão) contém as informações de status. Para localizar este trabalho na matriz, pesquise a matriz das estruturas JOB_INFO para localizar o trabalho de impressão cujo membro de Status tem o conjunto de bits de JOB_STATUS_PRINTING.

Um método mais fácil de determinar o status da impressora é examinar a Statusmember de uma estrutura PRINTER_INFO . Essa estrutura é retornada pela função GetPrinter . Há uma desvantagem dessa abordagem em que não há nenhum membro de cadeia de caracteres pStatus em uma estrutura PRINTER_INFO que pode fornecer informações de estado mais detalhadas ou completas. No entanto, há uma vantagem em que um monitor de porta pode definir algumas a impressora mais ampla bits de status da estrutura PRINTER_INFO . No entanto, observe que o monitor de porta padrão do Windows não precisa definir 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 stateinformation que não é estritamente relacionado a impressora física. Por exemplo, o membro de Status das 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 apenas para esse determinado trabalho de impressão. Além disso, observe que trabalhos de impressão podem se acumular em uma fila de impressão após eles têm sairá do spool e fica com um estado de JOB_STATUS_PRINTED.

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

O exemplo de código 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 o pool de impressão está ativado no Windows NT, pode haver mais de um trabalho de impressão despooling de uma fila de impressora que informará o status. Este código de exemplo não considera essa circunstância.

Referências

Para obter informações adicionais sobre instruções gerais de chamar funções Win32 Spooler, clique no número abaixo para ler o artigo na Base de dados de Conhecimento Microsoft:
158828  (http://support.microsoft.com/kb/158828/ ) A enumeração de chamada Wind32 Spooler APIs corretamente

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: 
kbFAQ kbhowto kbmt KB160129 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.
Clique aqui para ver a versão em Inglês deste artigo: 160129  (http://support.microsoft.com/kb/160129/en-us/ )
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store