Zum Abrufen des Status von einem Drucker und Drucken Auftrag

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 160129 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Der Status von Druckern und Druckaufträgen werden von der Win32-Spooler während der Despool drucken Auftrag aktualisiert. An allen anderen Fällen, wenn dieser Drucker nicht despooling und meldet keine Zustandsinformationen, gilt der Drucker bereit und im Leerlauf sein.

Weitere Informationen

Durch die Win32-API auf verwiesen wird, besteht ein "Drucker" aus den Druckertreiber, der Druckerwarteschlange und den Input-Output-Pfad zu den physischen Drucker. Das Betriebssystem behandelt einen physischen Drucker als lediglich das Ziel einer Drucken Auftrag von generiert und über ein System "Drucker", in den Rest dieses Artikels als Drucker bezeichnet übergeben.

Der offensichtlichsten Teil eines Druckers ist eine Druckerwarteschlange. Es wird von den Druck-Manager oder der Drucker-Ordner in den Benutzeroberflächen von Windows 95-Format verwaltet. Der Druckertreiber ist die Schnittstelle für den Drucker, die von Anwendungen verwendet wird, um Druckaufträge über Drucker Domänencontroller zu erstellen. Der e/a-Pfad für einen Drucker besteht aus verschiedenen Ebenen von Systemcode mit einem Portmonitor kulminieren.

Der Anschlussmonitor ist die Schnittstelle zu den physischen Drucker am Ende eines Systems Drucker Stream ab und ist verantwortlich für die Datenübertragung von einem drucken Auftrag über beliebige Verbindung zu den physischen Drucker vorhanden ist. Im Fall von bidirektionalen Drucker wäre der Anschlussmonitor für die Übertragung von Daten in und aus den physischen Drucker verantwortlich. Diese Verbindung und den physischen Drucker sind, in denen Fehler auftreten. Es ist die Auftrag der Anschlussmonitor um diesen Fehler zu melden.

Der Spooler nicht den Status der einem physischen Drucker Abfragen an den Drucker angeschlossen ist. Status der einem physischen Drucker bestimmt stattdessen, den Erfolg der drucken Auftrag bei der es über den Anschlussmonitor despooled ist. Wenn in diesem Prozess einige Fehler auftritt, wird der Fehler von der Anschlussmonitor gemeldet und in eine drucken Auftrag Statusinformationen aufgezeichnet. Der Spooler überträgt wiederum sinnvolle Fehlerinformationen zu der Druckerwarteschlange.

Folglich meldet ein System Drucker kein Status, wenn die Drucker Warteschlange leer ist. In diesem Zustand wird der Drucker Druckaufträge akzeptieren angenommen. Dies ist eine gültige Annahme, auch wenn der physische Drucker ein Fehler ist z. B. Status offline. Das Betriebssystem berücksichtigt den Drucker Druckaufträge zu akzeptieren, selbst wenn aus irgendeinem Grund es Übermittlung an den physischen Drucker nicht abschließen können. Eine solche Situation gilt ein Fehlerzustand des Betriebssystems, die vom Benutzer behoben werden müssen. Es wird nicht Fehler reportable an die Anwendung betrachtet, die das Spoolen drucken Auftrag erfolgreich abgeschlossen.

Ermitteln des Status der einem physischen Drucker

Es ist eine grundlegende Voraussetzung, die ermitteln den Zustand der einem physischen Drucker wahr sein muss,: der Spooler muss versucht die Drucken Auftrag an den physischen Drucker zu senden. Dies ist die nur Zeit, die der Status des Druckers der Anschlussmonitor gemeldet hat. Darüber hinaus kann die aussagekräftige Informationen in den Status Membern einer Struktur JOB_INFO für die bestimmten drucken Auftrag gemeldet werden, da einige Anschlussmonitor diese Werte direkt gesetzt haben wird.

Die JOB_INFO -Strukturen enthalten Mitglied Status und Mitglied pStatus . Beide Mitglieder enthalten Statusinformationen des ein drucken Auftrag, die von der Anschlussmonitor gemeldet. Diese zwei Member unterscheiden sich insofern der Status -Member ein Bitfeld Status, die vordefinierten Werte enthält ist, während der pStatus -Member einen Zeiger auf eine Zeichenfolge ist, die nahezu alles enthalten. Diese Werte werden durch die Win32-SDK und der WinSpool.h-Headerdatei dokumentiert. Der pStatus -Member wird manchmal jedoch nicht immer auf eine Statuszeichenfolge beschreibenden festgelegt. Der Inhalt dieser Zeichenfolge werden durch jeden Portmonitor definiert.

JOB_INFO Strukturen werden von zwei API-Funktionen zurückgegeben: GetJob und EnumJobs. EnumJobs gibt ein Array von JOB_INFO -Strukturen, ohne den Aufrufer Verweis eines bestimmten Auftrag in der Warteschlange Drucker. Drucken Auftrag, die derzeit (Drucken) despooling ist enthält die Statusinformationen. Um dieses Auftrag in das Array zu suchen, suchen Sie das Array von JOB_INFO Strukturen um Drucken Auftrag zu suchen, deren Status Member die JOB_STATUS_PRINTING-bit festgelegt ist.

Eine einfachere Methode bestimmen des Druckerstatus ist, den Status Member einer Struktur PRINTER_INFO zu untersuchen. Diese Struktur wird durch die GetPrinter -Funktion zurückgegeben. Es ist ein Nachteil dieses Ansatzes, ist es keine pStatus Zeichenfolge Member in eine PRINTER_INFO -Struktur, die detaillierte oder umfangreiche Statusinformationen bereitstellen kann. Es ist jedoch ein Vorteil, ein Anschlussmonitor umfangreichere Drucker Statusbits der Struktur PRINTER_INFO Festlegen einiger kann. Beachten Sie jedoch, dass der Standard-Anschlussmonitor für Windows nicht in der Regel mehr als das PRINTER_STATUS_ERROR -Bit des Druckers Status Members festlegt.

Beachten Sie, dass die Status-Mitglieder einer Gruppe von Strukturen Zustandsinformationen enthält, die nicht unbedingt mit den physischen Drucker verknüpft ist. Beispielsweise kann der Status-Member der PRINTER_INFO -Strukturen festgelegt werden, mit PRINTER_STATUS_PAUSED oder PRINTER_STATUS_PENDING_DELETION , die ausschließlich für die Druckerwarteschlange relevant sind. Darüber hinaus enthalten der Status Member der Struktur JOB_INFO Zustandswerte für JOB_STATUS_PAUSED oder JOB_STATUS_DELETING , die nur für die bestimmten drucken Auftrag relevant sind. Beachten Sie außerdem, dass Druckaufträge in eine drucken Warteschlange ansammeln können, nachdem Sie despooled haben und mit einem Status von JOB_STATUS_PRINTED belassen werden würde.

Jede dieser Funktionen erfordert ein Handle an einen Drucker um den gewünschten Drucker zu identifizieren. Dieses Handle wird von der Funktion OpenPrinter abgerufen, das akzeptiert eine Zeichenfolge mit den Namen des Druckers. Dieser Name kann entweder den lokalen Namen des Druckers oder eine UNC-Freigabenamen auf einem Netzwerkdrucker.

Der folgende Beispielcode demonstriert wie die Funktion EnumJobs ordnungsgemäß zum Abrufen von JOB_INFO Strukturen aufrufen und die GetPrinter -Funktion zum Abrufen von PRINTER_INFO Strukturen aufrufen:

Beispielcode

   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;

   }
				
Hinweis : Wenn Druckerpools unter Windows NT aktiviert ist, kann es mehrere drucken Auftrag despooling aus einer Warteschlange Drucker, die einen Status meldet. Dieser Beispielcode berücksichtigt nicht der Fall.

Informationsquellen

Weitere Informationen über allgemeine Anweisungen zum Aufrufen von Win32-Spooler-Funktionen finden Sie die folgende KB-Artikelnummer:
158828How To Call Win32-Spooler-Enumeration APIs ordnungsgemäß

Eigenschaften

Artikel-ID: 160129 - Geändert am: Dienstag, 21. November 2006 - Version: 4.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Win32 Application Programming Interface, wenn verwendet mit:
    • 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
Keywords: 
kbmt kbfaq kbhowto KB160129 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 160129
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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