Jak získat stav tiskárny a tiskové úlohy

Překlady článku Překlady článku
ID článku: 160129 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Stav tiskárny a tiskové úlohy jsou aktualizovány zařazovací služba Win32 během despool tiskové úlohy. Ve všech ostatních případech, pokud je dané tiskárny není despooling a sestav se považuje za žádné stavové informace tiskárny být připraven a nečinnosti.

Další informace

Uvedené rozhraní Win32 API, "tiskárna" se skládá z tiskárny ovladač tiskové fronty a vstupní a výstupní cestu k fyzické tiskárny. Operační systém považuje za pouze určení fyzické tiskárny tiskové úlohy generovány a prošla systémem "Tiskárna" uvedené ve zbytku tohoto článku jako tiskárna.

Nejvíce viditelné části tiskárny je tisková fronta. Je spravována Tisk správce nebo složky tiskárny ve stylu systému Windows 95 uživatelů rozhraní. Ovladač tiskárny je rozhraní na tiskárně, která je použita aplikace pro vytvoření tiskové úlohy prostřednictvím tiskárny DCs. I/O cestu Tiskárny se skládá z několika vrstev systému kódu ukončené s portem sledování.

Sledování portu je rozhraní fyzické tiskárně na dolů- datový proud koncového systému tiskárny a je odpovědný za přenos dat tiskové úlohy přes jakékoli připojení existuje fyzické tiskárny. U tiskárny obousměrné by bylo sledování portu za přenos dat do a z fyzické tiskárny. To připojení fyzické tiskárny jsou a kde dochází k chybám. Je úloha sledování portu na tyto zprávy o chybách.

Zařazovací služba není dotaz na stav fyzické tiskárny, na které Tiskárna je připojena. Místo toho určuje stav fyzické tiskárny Úspěch tiskové úlohy v době je despooled přes port sledování. V případě některých chyb v tomto procesu je vykazován chyby port monitor a zaznamenávat informace o stavu tiskové úlohy. Zařazovací služba, naopak šíří informace o přiměřené chyby do fronty tiskárny.

V důsledku toho systému tiskárny hlásí žádný stav v případě, že je tisková fronta prázdný. V tomto stavu se předpokládá tiskárna přijímá tiskové úlohy. Toto je platný předpokladů i v případě, že tiskárna skutečně chybu státu jako off-line. Operační systém považuje tiskárna připravena k přijmete tiskové úlohy, i když z nějakého důvodu nemůže dokončit dodání fyzické tiskárny. Taková situace je považována za stavu chyby v operační systém musí být adresována uživatelem. Není za podléhající hlášení do aplikace, ve které je povoleno chybu úspěšně dokončeno zařazování tiskové úlohy.

Určení státu fyzické tiskárny

Existuje jeden základní předpokladu, že musí být splněny ke zjištění stavu fyzické tiskárny: zařazovací služba musí být pokouší odeslat tiskovou úlohu fyzické tiskárny. Toto je jediný případ, kdy je stav tiskárny vykazován sledování portu. Kromě toho, nejdůležitější informace může být uvedena ve stavu členů JOB_INFO konstrukce pro danou konkrétní tiskovou úlohu, protože některé sledování portu bude mít tyto hodnoty nastavit přímo.

Na JOB_INFO obsahují struktur Stav člen a pStatus člen. Obě obsahují informace o stavu tiskové úlohy vykazován sledování portu. Tyto dva členy liší, Stav člen je bitové pole států, který obsahuje předdefinované hodnoty, zatímco pStatus člen je ukazatel na řetězec, který by mohl obsahovat prakticky cokoliv. Tyto hodnoty jsou zdokumentovány v sadě Win32 SDK a záhlaví souboru WinSpool.h. Na pStatus člen někdy, ale ne vždy nastavena na stav popisný řetězec. Obsah tohoto řetězce jsou definovány jednotlivé sledování portu.

JOB_INFO struktury jsou vráceny pomocí dvou funkcí rozhraní API: GetJob a EnumJobs. EnumJobs vrátí pole JOB_INFO struktury bez nutnosti, aby volající odkazovat na konkrétní úlohy v tiskové frontě. Tiskové úlohy, který je aktuálně despooling (tisk) obsahuje informace o stavu. Chcete-li v poli Najít tuto úlohu, vyhledejte pole JOB_INFO je nastaven bit struktur vyhledejte tiskové úlohy, jejichž stav člen má JOB_STATUS_PRINTING.

Je jednodušší metodu stanovení stav tiskárny chcete zjistit stav člen PRINTER_INFO Struktura. Tato struktura vrátil GetPrinter funkce. Nevýhodou tohoto přístupu je v tom, že neexistuje žádný pStatus řetězec člena PRINTER_INFO Struktura, která může poskytnout podrobné nebo rozsáhlé informace státu. Existuje však výhodu v tom, že program port monitor může nastavit některé rozsáhlejší tiskárny bitů stavu PRINTER_INFO Struktura. Upozorňujeme však, že výchozí sledování portu pro systém Windows nenastaví obvykle více než PRINTER_STATUS_ERROR bit člena stav tiskárny.

Stát může obsahovat členy stav buď sady struktur informace, které nezbytně nesouvisí s tiskárnou. Pro například člen stav PRINTER_INFO struktury může být nastavena s PRINTER_STATUS_PAUSED nebo PRINTER_STATUS_PENDING_DELETION, které jsou nezbytně důležité pro tiskové fronty. Také stav člen JOB_INFO struktura může obsahovat hodnoty stavu JOB_STATUS_PAUSED nebo JOB_STATUS_DELETING, které se vztahují pouze na danou konkrétní tiskovou úlohu. Upozorňujeme také, že tiskové úlohy mohou hromadit v tiskové frontě po mají despooled a zůstane s stavu JOB_STATUS_PRINTED.

Každá z těchto funkcí vyžaduje popisovač tiskárny k identifikaci požadované tiskárně. Tento popisovač je získáno OpenPrinter funkce, která přijímá řetězec obsahující název tiskárny. Tento název může být buď místní název tiskárny nebo UNC sdílet název síťové tiskárny.

Následující ukázkový kód demonstruje, jak volat EnumJobs funkce správně načíst JOB_INFO struktury a jak se má volat GetPrinter funkce pro načtení PRINTER_INFO struktur:

Ukázkový kód

   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;

   }
				
POZNÁMKA:: Je-li fondy tiskáren povolena v systému Windows NT, může existovat více než jeden despooling tiskové úlohy z tiskové fronty, zprávy stavu. Tento ukázkový kód nepovažuje tuto okolnost.

Odkazy

Další informace o obecné pokyny při volání funkce zařazování Win32 klepnutím na následující číslo článku databáze Microsoft Knowledge Base:
158828Způsob zařazování Wind32 volání rozhraní API pro výčet správně

Vlastnosti

ID článku: 160129 - Poslední aktualizace: 23. dubna 2011 - Revize: 6.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Win32 Application Programming Interface na těchto platformách
    • 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
Klíčová slova: 
kbFAQ kbhowto kbmt KB160129 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:160129

Dejte nám zpětnou vazbu

 

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