Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

Cómo obtener el estado de una impresora y un trabajo de impresión

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 160129
Resumen
El estado de las impresoras y trabajos de impresión son actualizados por el Spoolerduring de Win32 la despool de un trabajo de impresión. En cualquier otro momento, cuando ese isnot despooling de impresora y los informes información de estado, la impresora no es elTiempo ser inactivo y listo.
Más información
Que se refiere la API de Win32, una "impresora" se compone de la printerdriver, la cola de impresión y la ruta de acceso de entrada y salida de la impresora física.El sistema operativo se considera a una impresora física simplemente el destino impresión trabajo generado por y pasa a través de un sistema de "Impresora", se la denomina aen el resto de este artículo como una impresora.

La parte más visible de una impresora es una cola de impresión. Se administra por thePrint Manager o las carpetas de la impresora en el userinterfaces de estilo Windows 95. El controlador de impresora es la interfaz a la impresora que es usados por aplicaciones para crear trabajos de impresión a través de los controladores de dominio de la impresora. El path de I/O para aPrinter consta de varias capas de código del sistema con un monitor de puertos.

El monitor de puerto es la interfaz a la impresora física al final de un sistema de impresora corriente abajo y es responsable de transferir la información de un trabajo de impresión a través de cualquier tipo de conexión existe en la impresora física.En el caso de las impresoras bidireccionales, el monitor de puerto sería responsable para la transferencia de datos a la impresora física. Thisconnection y la impresora física, son donde se producen errores. Es el trabajo que el monitor de puerto para informar de los errores.

La cola de impresión no consulta el estado de una impresora física a la que está conectado aPrinter. En su lugar, el estado de éxito de un trabajo de impresión en el momento determinesthe impresora física es despooled sobre el Monitor de puertos. Si se produce algún error en este proceso, el error se comunica el monitor de la isla de y se registran en la información de estado de un trabajo de impresión. La cola de impresión, a su vez, propaga la información de error razonable a la cola de impresión.

Por lo tanto, un sistema de impresora no informa de ningún estado cuando isempty de la cola de la impresora. En este estado, se supone que la impresora lista para aceptar trabajos de impresión.Se trata de una suposición válida incluso si la impresora física está en un errorstate como fuera de línea. El sistema operativo considera el Aceptar listo impresora los trabajos de impresión incluso si, por alguna razón, no puede completar la entrega a la impresora física. Tal circunstancia se considera un estado de error en el sistema operativo que debe ser atendido por el usuario. Notconsidered es un error reportable a la aplicación que permite completar la cola de impresión del trabajo de impresión correctamente.

Determinar el estado de una impresora física

Hay un principio fundamental que debe ser verdadera para determinar el estado de una impresora física: la cola de impresión debe intentar enviar un trabajo de impresión en la impresora física. Se trata de la única vez que supervisar el estado de la isreported de la impresora por el puerto. Además, la más significativa puede indicarse en los miembros de una estructura JOB_INFO con ese trabajo de impresión de estado porque un monitor de puerto habrá establecer estos valores directamente.

Las estructuras JOB_INFO contienen un miembro de estado y pStatus . Ambos miembros contienen información del estado de un trabajo de impresión por el monitor de puerto. Estos dos miembros se diferencian en que el miembro de estado es un campo de bits de Estados que contiene valores predeterminados, mientras que el miembro pStatus es un puntero a una cadena que puede contener cualquier cosa. Estos valores se documentan en el SDK de Win32 y el archivo de encabezado WinSpool.h. A veces, pero no siempre, el miembro de pStatus se establece en una cadena descriptiva del estado. El contenido de esta cadena se define por cada monitor de puerto.

Estructuras JOB_INFO devuelve dos funciones de la API: GetJob y EnumJobs. EnumJobs devuelve una matriz de estructuras JOB_INFO sin necesidad de la referencia de llamador un trabajo determinado en la cola de impresión. El trabajo de impresión es actualmente despooling (impresión) contiene la información de estado. Para buscar este trabajo en la matriz, buscar en la matriz de estructuras JOB_INFO para localizar el trabajo de impresión cuyo miembro de estado tiene el conjunto de bits de JOB_STATUS_PRINTING.

Un método más fácil de determinar el estado de la impresora es examinar la Statusmember de una estructura PRINTER_INFO . Esta estructura es devuelto por la función GetPrinter . Hay una desventaja de este enfoque en que no hay ningún miembro de cadena de pStatus en una estructura PRINTER_INFO que puede proporcionar información de estado más amplia o detallada. Sin embargo, hay una ventaja en que un monitor de puerto puede establecer algunas de la impresora más bits de estado de la estructura PRINTER_INFO . Sin embargo, tenga en cuenta que el monitor de puerto predeterminado para Windows no normalmente establece el bit PRINTER_STATUS_ERROR del miembro de estado de la impresora más.

Tenga en cuenta que los miembros de cada conjunto de estructuras de estado pueden contener stateinformation que no está estrictamente relacionada con la impresora física. Por ejemplo, puede establecerse el miembro de estado de las estructuras PRINTER_INFO con PRINTER_STATUS_PAUSED o PRINTER_STATUS_PENDING_DELETION, que son estrictamente relevantes a la cola de impresión. Además, el miembro de estado de la estructura JOB_INFO puede contener valores de estado para JOB_STATUS_PAUSED o JOB_STATUS_DELETING, que son importantes sólo para ese trabajo de impresión concreto. Además, tenga en cuenta que los trabajos de impresión se pueden acumular en una cola de impresión después de que hayan salido de la cola y se dejaría con un estado de JOB_STATUS_PRINTED.

Cada una de estas funciones requiere un identificador de una impresora para identificar impresora de thedesired. Este identificador se obtiene de la función OpenPrinter , que acepta una cadena que contiene el nombre de la impresora. Este nombre puede ser el nombre de la impresora local o una ruta UNC comparten el nombre de una impresora de red.

El código de ejemplo siguiente muestra cómo llamar a la función EnumJobs correctamente para recuperar las estructuras JOB_INFO y cómo llamar a la función GetPrinter para recuperar las estructuras PRINTER_INFO :

Código de ejemplo

   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;   }				
Nota: cuando está habilitada la agrupación de impresoras en Windows NT, puede haber más de un trabajo de impresión despooling de una cola de impresión que se comuniquen un estado. Este ejemplo de código no tiene en cuenta esa circunstancia.
Referencias
Para obtener información adicional acerca de las instrucciones generales sobre cómo llamar a las funciones de cola de impresión Win32, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
158828 Enumeración de cola de impresión llamada Win32 API cómo correctamente
GdiSpool

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 160129 - Última revisión: 03/14/2015 06:09:00 - Revisión: 5.0

Microsoft Win32 Application Programming Interface

  • kbFAQ kbhowto kbmt KB160129 KbMtes
Comentarios