Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Wie Sie den Status eines Druckers und eines Druckauftrags

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 160129
Zusammenfassung
Der Status von Druckern und Druckaufträgen sind die Despool eines Druckauftrags durch die Win32-Spoolerduring aktualisiert. In allen anderen Fällen wird dieser Drucker Isnot despooling und Berichte keine Zustandsinformationen, den Drucker Consideredto bereit und im Leerlauf sein.
Weitere Informationen
Im Sinne der Win32-API, einer "Printer" die Druckertreiber, die Druckwarteschlange und den e/a-Pfad zu den physischen Drucker umfasst.Vom Betriebssystem behandelt einen physischen Drucker lediglich das Ziel eines Druckauftrags von generiert und durch ein System übergeben "Drucker", genannten Toin im weiteren Verlauf dieses Artikels als Drucker.

Der sichtbare Teil eines Druckers ist eine Druckwarteschlange. Es wird vom ThePrint-Manager oder den Ordner Drucker in der Windows 95-Format Userinterfaces verwaltet. Der Druckertreiber ist die Schnittstelle auf den Drucker, die bei Anwendungen, die Druckaufträge über DCs-Drucker erstellen. Der e/a-Pfad für die aPrinter besteht aus mehreren Ebenen System Code mit einem Portmonitor abgeschlossen.

Der Anschlussmonitor ist die Schnittstelle zu den physischen Drucker am Ende eines Systems Drucker Downstream- und ist verantwortlich für die Übertragung der Dataof einen Druckauftrag über beliebige Verbindungen auf den physischen Drucker vorhanden ist.Bei bidirektionalen Druckern wird der Anschlussmonitor Recht für die Übertragung von Daten zwischen den physischen Drucker. Thisconnection und den physischen Drucker sind, in denen Fehler auftreten. Es ist der Job der Anschlussmonitor, diese Fehler zu melden.

Der Spooler ist nicht für den Zustand des physischen Druckers Abfragen mit dem aPrinter verbunden ist. In diesem Fall ist der Zustand eines physischen Drucker Determinesthe Erfolgs eines Druckauftrags zum Zeitpunkt es despooled über die Portmonitor. Tritt ein Fehler bei diesem Vorgang, wird der Fehler von Theport-Monitor gemeldet und Status-Informationen für einen Druckauftrag. Der Spooler weitergibt, angemessene Fehlerinformationen an die Druckerwarteschlange.

Deshalb berichtet ein System Drucker kein Status, wenn die Druckerwarteschlange Isempty. In diesem Zustand wird der Drucker bereit, Druckaufträge verarbeiten angenommen.Dies ist eine gültige Annahme, selbst wenn der physische Drucker z. B. in einem Errorstate ist offline. Das Betriebssystem berücksichtigt der Drucker bereit davon Druckaufträge selbst wenn aus irgendeinem Grund Übermittlung an den physischen Drucker durchgeführt werden kann. Diesem Fall wird ein Fehlerzustand des Betriebssystems betrachtet, die vom Benutzer behoben werden müssen. Notconsidered ist ein Fehler an die Anwendung, die Berichtspflichtigen zulässig amsterdambegonnenen das Spoolen des Druckauftrags erfolgreich.

Ermitteln des Status von einem physischen Drucker

Es gibt einen grundlegenden Voraussetzungen gelten, die den Zustand einer physischen Drucker bestimmt erfüllt sein muss: der Spooler muss versuchen, eine Drucken muss den physischen Drucker senden. Dies ist nur dann den Status der Drucker-Isreported vom Anschluss überwachen. Darüber hinaus werden aussagekräftige Informationmay gemeldet, in der Status-Mitglieder eine JOB_INFO -Struktur für diesen bestimmten Druckauftrag da einige Anschlussmonitor diese Werte direkt angegeben werden.

Die JOB_INFO Strukturen enthalten einen Status und pStatus . Beide Mitglieder enthalten Statusinformationen eines Druckauftrags von der Anschlussmonitor gemeldet. Diese zwei Member unterscheiden sich, da der Status ein Bitfeld Staaten gehört, die vordefinierten Werte enthält, während der pStatus -Member einen Zeiger auf eine Zeichenfolge ist, die beinahe jedes beliebige Objekt enthalten kann. Diese Werte werden durch die Win32-SDK und die Header-Datei WinSpool.h dokumentiert. Der pStatus -Member wird manchmal, aber nicht immer in einen String beschreibenden Status festgelegt. Der Inhalt dieser Zeichenfolge werden durch jeden Portmonitor definiert.

JOB_INFO Strukturen von zwei API-Funktionen zurückgegeben werden: GetJob und EnumJobs. EnumJobs gibt ein Array von JOB_INFO -Strukturen, die ohne den Aufrufer Verweis eines bestimmten Auftrags in der Druckerwarteschlange. Der Druckauftrag zurzeit (Drucken) despooling ist, die enthält die Status-Informationen. Suchen Sie dieser Auftrag im Array das Array von JOB_INFO -Strukturen, um den Druckauftrag zu suchen, deren Status-Mitglied der JOB_STATUS_PRINTING-bit festgelegt ist.

Eine einfachere Methode zur Bestimmung des Druckerstatus ist, untersuchen Sie die Statusmember einer PRINTER_INFO -Struktur. Diese Struktur wird von der Funktion GetPrinter zurückgegeben. Ein Nachteil dieses Ansatzes ist es, ist kein Mitglied des pStatus -Zeichenfolge in eine PRINTER_INFO -Struktur, die ausführlichere oder umfangreiche Statusinformationen bereitstellen kann. Allerdings besteht ein Vorteil, dass einige umfangreichere Drucker ein Anschlussmonitor Statusbits der PRINTER_INFO -Struktur festlegen 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 einstellt.

Beachten Sie, dass beide Sätze von Strukturen Familienangehörigen Status Stateinformation enthalten können, die nicht unbedingt auf den physischen Drucker. Beispielsweise kann das Status-Mitglied 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 kann das Status-Mitglied der JOB_INFO -Struktur für JOB_STATUS_PAUSED oder JOB_STATUS_DELETING, die nur für diesen bestimmten Druckauftrag sind Statuswerte enthalten. Beachten Sie auch, dass Druckaufträge in einer Druckerwarteschlange erzeugen können, nachdem sie nicht richtig zurückgespult haben und mit dem JOB_STATUS_PRINTEDZustand belassen werden würde.

Jede dieser Funktionen muss ein Handle an einen Drucker, um Drucker Thedesired zu identifizieren. Dieses Handle wird aus der Funktion OpenPrinter abgerufen, die eine Zeichenfolge mit dem Namen des Druckers akzeptiert. Dieser Name kann entweder den lokalen Namen des Druckers, oder einen UNC-Freigabenamen auf einem Netzwerkdrucker.

Der folgende Beispielcode veranschaulicht, wie die EnumJobs Funktion ordnungsgemäß zum Abrufen von JOB_INFO -Strukturen und das Aufrufen der GetPrinter -Funktion zum Abrufen von PRINTER_INFO -Strukturen:

Beispiel-Code

   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 in einem Druckerpool auf Windows NT aktiviert ist, werden möglicherweise mehr als ein Druckauftrag despooling aus einer Druckerwarteschlange, die den Status meldet. In diesem Beispielcode wird dieser Umstand nicht berücksichtigt.
Informationsquellen
Weitere Informationen über allgemeine Anweisungen zum Aufrufen von Funktionen der Win32-Spooler klicken Sie auf die folgende Artikelnummer, um den Artikel der Microsoft Knowledge Base anzuzeigen:
158828 How To Call Win32-Spooler-Enumeration APIs ordnungsgemäß
GdiSpool

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 160129 – Letzte Überarbeitung: 03/14/2015 05:47:00 – Revision: 5.0

Microsoft Win32 Application Programming Interface

  • kbFAQ kbhowto kbmt KB160129 KbMtde
Feedback
&t="> var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write("