Ako získať štatút tlačiareň a tlačovú úlohu

Preklady článku Preklady článku
ID článku: 160129 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

Stav tlačiarne a tlačové úlohy aktualizujú zaraďovacia služba Win32 počas despool tlačovú úlohu. Vo všetkých ostatných časy, keď tlačiareň je nie despooling a správy sa považuje za žiadne informácie o stave, tlačiareň byť pripravený nečinný.

DALSIE INFORMACIE

Ako je uvedené rozhranie API systému Win32, "tlačiareň" sa skladá z tlačiarne ovládač, Front tlače a vstupno-výstupný cestu k fyzickej tlačiarni. Operačný systém spracuje fyzická tlačiareň ako iba určenia tlačovú úlohu generované a prešla systému "Tlačiareň," uvedeného vo zvyšku tohto článku ako tlačiareň.

Najviac Viditeľná časť tlačiareň je frontu tlače. Riadi ju Tlač Manager alebo tlačiareň priečinkov vo Windows 95-štýl užívateľov rozhrania. Ovládač tlačiarne je rozhranie pre tlačiareň, ktorá používa žiadosti o vytvorenie tlačové úlohy prostredníctvom tlačiareň DCs. I / cesta pre Tlačiareň pozostáva z viacerých vrstiev kód systému vyvrcholili prístavu monitorovať.

Monitor portov je rozhrania fyzickej tlačiarni v down- prúd konca systému tlačiarne a je zodpovedná za prenos údajov tlačovú úlohu cez akékoľvek spojenie existuje fyzickej tlačiarni. V prípade obojsmerné tlačiarne, monitor portu by byť zodpovedný za prenos údajov do a z fyzickej tlačiarni. Toto pripojenie a fyzickej tlačiarni, sú tam, kde sa vyskytujú chyby. To je úloha port monitor správy týchto chýb.

Zaraďovač tlače pre štát fyzická tlačiareň na ktoré dotazy Tlačiareň pripojená. Namiesto toho štátu fyzickej tlačiarni určuje úspech tlačovú úlohu v čase, je odvinuté cez port monitorovať. Ak niektoré chyba vyskytuje v tomto procese, chyba je hlásená port monitor a zaznamenané informácie o stave tlačovej úlohy. Zaraďovač, Naopak, propaguje primeranej chyba informácie do frontu tlačiarne.

V dôsledku toho systém tlačiareň správy žiadny štatút, keď je front tlače prázdne. V tomto stave sa predpokladá tlačiareň pripravená akceptovať tlačové úlohy. Toto je platný predpoklad, aj keď fyzická tlačiareň je v chyba štátu, ako je off-line. Operačný systém považuje tlačiareň pripravená akceptovať tlačové úlohy, dokonca aj vtedy, ak z nejakého dôvodu nemôže dokončiť dodávky fyzická tlačiareň. Táto okolnosť sa považuje za chybu štátu v operačný systém, ktoré je potrebné riešiť užívateľ. Nie je za chybu vykazovaniu na aplikáciu, ktorá je povolené úspešne zavŕšiť zaraďuje tlačová úloha.

Určenie štátu fyzickej tlačiarni

Existuje jeden základný predpoklad, že musia byť splnené na určenie štátu fyzické tlačiarne: zaraďovacia služba musí Pokúšam sa odoslať tlačovú úlohu fyzickej tlačiarni. Je to len čas je stav tlačiarne hlásené monitor portu. Okrem toho najvýznamnejšie informácie môžu byť vykazované v štatút členov JOB_INFO štruktúra pre tento konkrétny tlačovú úlohu, pretože niektoré port monitor bude mať priamo tieto hodnoty nastavené.

V JOB_INFO štruktúry obsahovať Stav Členské a pStatus člen. Obaja členovia obsahovať stavové informácie tlačovú úlohu hlásené monitor portu. Týchto dvoch členov líšia v tomto Stav člen je bitové pole štátov, ktoré obsahuje vopred určené hodnoty, zatiaľ čo pStatus člen je smerník na reťazec, ktorý môže obsahovať čokoľvek. Tieto hodnoty sú zdokumentované Win32 SDK a hlavička súboru WinSpool.h. V pStatus člen niekedy, ale nie vždy nastavená na popisné Stavový reťazec. Obsah tohto reťazca sú definované každý monitor portu.

JOB_INFO štruktúry sú odoslal dva API funkcie: GetJob a EnumJobs. EnumJobs Vracia pole JOB_INFO štruktúry bez požadovania, že volajúci odkaz najmä prácu v front tlačiarne. Tlačovú úlohu, ktorá je v súčasnosti despooling (tlač) obsahuje informácie o stave. Nájsť túto prácu v poli Hľadať pole JOB_INFO nastavený bit štruktúr vyhľadajte tlačovej úlohy, ktorých stav člen má JOB_STATUS_PRINTING.

Jednoduchšie metódy stanovenia stav tlačiarne je skúmať stav člen PRINTER_INFO štruktúra. Táto štruktúra vráti GetPrinter Funkcia. Existuje nevýhodou tohto prístupu, že neexistuje žiadne pStatus reťazec člena v PRINTER_INFO štruktúra, ktorá môže poskytnúť podrobné alebo rozsiahle informácie štátu. Existuje však výhodu v tom, že port monitor môže stanoviť niektoré rozsiahlejšie tlačiarne stav bitov PRINTER_INFO štruktúra. Všimnite si, že predvolený port monitor pre systém Windows zvyčajne nenastaví viac ako PRINTER_STATUS_ERROR bitové tlačiarne štatút člena.

Všimnite si, že štatút členov buď súbor stavieb môže obsahovať štátu informácie, ktoré nie je nevyhnutne spojené s fyzickej tlačiarni. Pre napríklad, stav člen PRINTER_INFO štruktúry môže byť stanovená s PRINTER_STATUS_PAUSED alebo PRINTER_STATUS_PENDING_DELETION, sú nevyhnutne dôležité pre front tlače. Tiež stav člen JOB_INFO štruktúra môže obsahovať hodnoty stavu pre JOB_STATUS_PAUSED alebo JOB_STATUS_DELETING, sú dôležité len pre tento konkrétny tlačovej úlohy. Upozorňujeme tiež, že tlačové úlohy môže hromadiť vo fronte tlače po mať odvinuté a by bolo ponechané s stave JOB_STATUS_PRINTED.

Každá z týchto funkcií vyžaduje rukoväť na tlačiareň identifikovať požadovanú tlačiareň. Táto rukoväť sa získava z OpenPrinter Funkcia, ktorá prijíma reťazec, ktorý obsahuje názov tlačiarne. Tento názov môže byť lokálny názov tlačiarne alebo UNC zdieľať názov na sieťovej tlačiarni.

Nasledujúci kód vzorky preukáže ako volať EnumJobs Funkcia správne na načítanie JOB_INFO štruktúry a ako volať GetPrinter Funkcia načítať PRINTER_INFO štruktúry:

Vzorky 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: Ak je zapnuté združovanie tlačiarní v systéme Windows NT, tam môže byť viac ako jeden despooling tlačovú úlohu z frontu tlačiarne, ktoré bude hlásiť stav. Táto vzorka kódu nepovažuje za túto okolnosť.

ODKAZY

Dodatočné informácie o všeobecných pokynov na volanie funkcií zaraďovacia služba Win32, po kliknutí na nasledovné číslo článku databázy Microsoft Knowledge Base:
158828Ako volanie Wind32 zaraďovača enumerácie API správne

Vlastnosti

ID článku: 160129 - Posledná kontrola: 17. októbra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Win32 Application Programming Interface, pri použití s produktom:
    • 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
Kľúčové slová: 
kbFAQ kbhowto kbmt KB160129 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:160129

Odošlite odozvu

 

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