Τρόπος λήψης της κατάστασης εκτυπωτή και μιας εργασίας εκτύπωσης

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 160129 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Η κατάσταση των εκτυπωτών και των εργασιών εκτύπωσης ενημερώνονται από την ουρά εκτύπωσης Win32 κατά τη διάρκεια της despool μιας εργασίας εκτύπωσης. Όλες τις άλλες φορές, όταν αυτός ο εκτυπωτής δεν είναι despooling και αναφέρει πληροφορίες κατάστασης, θεωρείται ο εκτυπωτής είναι έτοιμη και αδράνειας.

Περισσότερες πληροφορίες

Όπως αναφέρεται από το API του Win32, "εκτυπωτής" αποτελείται από το πρόγραμμα οδήγησης εκτυπωτή, η ουρά εκτύπωσης και ο φυσικός εκτυπωτής τη διαδρομή εισόδου/εξόδου. Το λειτουργικό σύστημα αντιμετωπίζει μια φυσική εκτυπωτή ως απλώς τον προορισμό μιας εργασίας εκτύπωσης που δημιουργείται από και μέσω ενός συστήματος "Εκτυπωτή" αναφέρεται στο υπόλοιπο αυτού του άρθρου ως ένας εκτυπωτής.

Το πιο ορατό τμήμα του εκτυπωτή έχει μια ουρά εκτυπώσεων. Γίνεται από τη Διαχείριση εκτυπώσεων ή τους φακέλους του εκτυπωτή σε περιβάλλοντα εργασίας χρήστη το στυλ των Windows 95. Το πρόγραμμα οδήγησης εκτυπωτή είναι η διασύνδεση με τον εκτυπωτή που χρησιμοποιείται από εφαρμογές για να δημιουργήσετε εργασίες εκτύπωσης μέσω του εκτυπωτή ελεγκτές τομέα. Η διαδρομή εισόδου/εξόδου για εκτυπωτή αποτελείται από πολλά επίπεδα του κώδικα συστήματος culminating με μια Εποπτεία θύρας.

Η εποπτεία θύρας είναι η διασύνδεση φυσικής εκτυπωτή στο τέλος ροή κάτω από ένα σύστημα εκτυπωτή και είναι υπεύθυνη για τη μεταφορά των δεδομένων μιας εργασίας εκτύπωσης σε οποιαδήποτε σύνδεση υπάρχει ο φυσικός εκτυπωτής. Στην περίπτωση των εκτυπωτών διπλής κατεύθυνσης, θα είναι υπεύθυνη για τη μεταφορά δεδομένων από ο φυσικός εκτυπωτής και η εποπτεία θύρας. Αυτή η σύνδεση και ο φυσικός εκτυπωτής, είναι όπου παρουσιάζονται σφάλματα. Είναι η εργασία της εποπτείας θύρας για να αναφέρετε αυτά τα σφάλματα.

Η ουρά εκτύπωσης δεν ερωτήματος για την κατάσταση του φυσικού εκτυπωτή στο οποίο είναι συνδεδεμένος ένας εκτυπωτής. Αντί για αυτό, η κατάσταση του φυσικού εκτυπωτή Καθορίζει την επιτυχία της εργασίας εκτύπωσης τη στιγμή αυτή είναι despooled πάνω από την εποπτεία θύρας. Εάν παρουσιαστεί κάποιο σφάλμα σε αυτήν τη διαδικασία, το σφάλμα είναι που αναφέρεται από την Εποπτεία της θύρας και να καταγραφεί σε πληροφορίες για την κατάσταση μιας εργασίας εκτύπωσης. Η ουρά εκτύπωσης, με τη σειρά του, μεταδίδει πληροφορίες σφάλματος λογική για την ουρά του εκτυπωτή.

Κατά συνέπεια, ένα σύστημα εκτυπωτή αναφέρει καμία κατάσταση όταν η ουρά εκτυπωτή είναι κενό. Σε αυτήν την κατάσταση, ο εκτυπωτής θεωρείται έτοιμος να αποδεχθείτε εργασίες εκτύπωσης. Αυτή είναι μια έγκυρη την υπόθεση, ακόμη και αν είναι ο φυσικός εκτυπωτής επέστρεψε σφάλμα όπως κατάσταση χωρίς σύνδεση. Το λειτουργικό σύστημα θεωρεί ότι ο εκτυπωτής να αποδεχθείτε εργασίες εκτύπωσης, ακόμα και αν, για κάποιο λόγο, αυτό δεν μπορεί να ολοκληρώσει την παράδοση ο φυσικός εκτυπωτής. Μια τέτοια περίπτωση, θεωρείται κατάσταση σφάλματος του λειτουργικού συστήματος που πρέπει να αντιμετωπιστούν από το χρήστη. Δεν θεωρείται σφάλμα reportable στην εφαρμογή που επιτρέπεται να ολοκληρωθεί με επιτυχία η καταχώρηση σε ουρά της εργασίας εκτύπωσης.

Προσδιορισμός της κατάστασης του φυσικού εκτυπωτή

Υπάρχει ένας βασικός premise που πρέπει να ισχύει για τον προσδιορισμό της κατάστασης του φυσικού εκτυπωτή: της ουράς πρέπει να προσπαθείτε να στείλετε μια εργασία εκτύπωσης στον εκτυπωτή φυσική. Αυτή είναι η μοναδική φορά που αναφέρεται στην κατάσταση του εκτυπωτή από την εποπτεία θύρας. Επιπλέον, ενδέχεται να αναφερθεί τις πιο σημαντικές πληροφορίες στα μέλη της κατάστασης ενόςJOB_INFOδομή για αυτό συγκεκριμένη εργασία εκτύπωσης, επειδή ορισμένες εποπτεία θύρας θα ορίσετε αυτές τις τιμές απευθείας.

Για ναJOB_INFOδομές που περιέχουν έναΚατάστασημέλος και έναpStatusΜέλος. Και τα δύο μέλη περιέχουν πληροφορίες για την κατάσταση μιας εργασίας εκτύπωσης που αναφέρεται από την εποπτεία θύρας. These two members differ in that theΚατάστασηmember is a bit field of states that contains predetermined values, while thepStatusmember is a pointer to a string that could contain just about anything. These values are documented by the Win32 SDK and the WinSpool.h header file. Για ναpStatusmember is sometimes, but not always, set to a descriptive status string. The contents of this string are defined by each port monitor.

JOB_INFOstructures are returned by two API functions: GetJob and EnumJobs. EnumJobs returns an array ofJOB_INFOstructures without requiring that the caller reference a particular job in the Printer queue. The print job that is currently despooling (printing) contains the status information. To find this job in the array, search the array ofJOB_INFOstructures to locate the print job whose Status member has the JOB_STATUS_PRINTING bit set.

An easier method of determining the printer status is to examine the Status member of aPRINTER_INFOstructure. This structure is returned by theGetPrinterFunction. There is a disadvantage to this approach in that there is nopStatusstring member in aPRINTER_INFOstructure that might provide more detailed or extensive state information. However, there is an advantage in that a port monitor may set some of the more extensive printer status bits of thePRINTER_INFOstructure. Note, however, that the default port monitor for Windows does not usually set more than thePRINTER_STATUS_ERRORbit of a Printer's Status member.

Note that the Status members of either set of structures may contain state information that is not strictly related to the physical printer. For example, the Status member of thePRINTER_INFOstructures may be set withPRINTER_STATUS_PAUSEDήPRINTER_STATUS_PENDING_DELETION, that are strictly relevant to the Print Queue. Also, the Status member of theJOB_INFOstructure may contain state values forJOB_STATUS_PAUSEDήJOB_STATUS_DELETING, that are relevant only to that particular print job. Note, also, that print jobs may accumulate in a Print queue after they have despooled and would be left with a state ofJOB_STATUS_PRINTED.

Each of these functions requires a handle to a printer to identify the desired Printer. This handle is obtained from theOpenPrinterfunction, that accepts a string containing the name of the printer. This name can be either the local name of the printer or a UNC share name to a network printer.

The following sample code demonstrates how to call theEnumJobsfunction properly to retrieveJOB_INFOstructures and how to call theGetPrinterfunction to retrievePRINTER_INFOstructures:

Δείγμα κώδικα

   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;

   }
				
ΣΗΜΕΙΩΣΗ: When printer pooling is enabled on Windows NT, there may be more than one print job despooling from a Printer queue that will report a status. This sample code does not consider that circumstance.

Αναφορές

For additional information about general instructions on calling Win32 Spooler functions, click the following article number to view the article in the Microsoft Knowledge Base:
158828How To Call Wind32 Spooler enumeration APIs properly

Ιδιότητες

Αναγν. άρθρου: 160129 - Τελευταία αναθεώρηση: Σάββατο, 18 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
Λέξεις-κλειδιά: 
kbFAQ kbhowto kbmt KB160129 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:160129

Αποστολή σχολίων

 

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