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

Seleccione idioma Seleccione idioma
Id. de artículo: 160129 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

El estado de las impresoras y trabajos de impresión son actualizados por la cola de Win32 durante despool de un trabajo de impresión. En otras ocasiones, cuando esa impresora no es despooling e no informes información de estado, la impresora se considera inactivo y listo.

Más información

Como se hace referencia a la API de Win32, está formada por "impresora" el controlador de impresora, la cola de impresión y la ruta de acceso de entrada/salida de la impresora física. El sistema operativo considera a una impresora física simplemente el destino de un trabajo de impresión generado por y pasan a un sistema "Impresora", en el resto de este artículo como un hace referencia.

La parte más visible de una impresora es una cola de impresión. Se está administrado por el Administrador de impresión o las carpetas impresoras en las interfaces de usuario de estilo Windows 95. El controlador de impresora es la interfaz en la impresora que se utiliza por las aplicaciones para crear trabajos de impresión a través de controladores de impresora. La ruta de E/s para una impresora consta de varios niveles de código del sistema culmina con un monitor de puerto.

El monitor de puerto es la interfaz en la impresora al final de secuencia de abajo de un sistema impresora física y es responsable de transferir los datos de un trabajo de impresión a través de cualquier conexión existe en la impresora física. En el caso de las impresoras bidireccionales, el monitor de puerto debería ser responsable de transferir datos hacia y desde la impresora física. Esta conexión y la impresora física son donde se producen errores. Es el trabajo del monitor de puerto para notificar los errores.

La cola no consulta el estado de una impresora física al que está conectada una impresora. En su lugar, el estado de una impresora física determina el éxito de un trabajo de impresión en el momento es despooled sobre el monitor de puerto. Si se produce algún error en este proceso, el error es notificado por el monitor de puerto y se registran en información de estado de un trabajo de impresión. La cola a su vez, propaga información de error razonable a la cola de impresora.

Por consiguiente, un sistema impresora no informa ningún estado cuando la cola de impresora está vacía. En este estado, la impresora se asume listo para aceptar trabajos de impresión. Esto es una suposición válida incluso si la impresora física es un error de estado como sin conexión. El sistema operativo considera la impresora listo para aceptar trabajos de impresión, incluso si por algún motivo, no puede finalizar la entrega a la impresora física. Tal una circunstancia se considera un estado de error en el sistema operativo que debe ser tratado por el usuario. No se considera un error reportable a la aplicación que se permitirá completar correctamente la cola de impresión del trabajo.

Determinar el estado de una impresora física

Hay una premisa fundamental que debe cumplirse para determinar el estado de una impresora física: la cola debe estar intentando enviar un trabajo de impresión a la impresora física. Esta es la hora sólo que se notifica el estado de la impresora en el monitor de puerto. Además, la información más significativa puede mostrarse en los miembros de estado de una estructura JOB_INFO para ese trabajo de impresión concreto porque algunos monitor de puerto se ha establecido estos valores directamente.

Las estructuras JOB_INFO contienen un miembro de estado y un miembro pStatus . Ambos miembros contienen información de estado de un trabajo de impresión notificado 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 prácticamente cualquier cosa. Estos valores se documentan por el SDK de Win32 y el archivo de encabezado WinSpool.h. El miembro de pStatus es a veces, pero no siempre, establecer en una cadena descriptiva de estado. El contenido de esta cadena se define por cada monitor de puerto.

estructuras JOB_INFO son devueltos por dos funciones de API: GetJob y EnumJobs. EnumJobs devuelve una matriz de estructuras JOB_INFO sin necesidad de la referencia de llamador un trabajo concreto en la cola de impresora. El trabajo de impresión está actualmente despooling (Imprimir) contiene la información de estado. Para encontrar este trabajo de la matriz, busque la matriz de estructuras JOB_INFO para localizar el trabajo de impresión cuyo estado miembro tiene el conjunto JOB_STATUS_PRINTING bit.

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

Tenga en cuenta que los miembros de estado de cualquier conjunto de estructuras pueden contener información de estado que no está estrictamente relacionada con la impresora física. Por ejemplo, se puede establecer el miembro de estado de las estructuras PRINTER_INFO con PRINTER_STATUS_PAUSED o PRINTER_STATUS_PENDING_DELETION , que son estrictamente relevantes para 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 relevantes sólo para ese trabajo de impresión concreto. Además, tenga en cuenta que los trabajos de impresión pueden acumular en una cola de impresión después de haber despooled y podría quedar con un estado de JOB_STATUS_PRINTED .

Cada una de estas funciones requiere un identificador para una impresora para identificar la impresora deseada. 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 UNC comparten el nombre a una impresora de red.

En el siguiente ejemplo de código muestra cómo se llama a la función de EnumJobs correctamente para recuperar JOB_INFO estructuras y cómo llamar a la función GetPrinter para recuperar PRINTER_INFO estructuras:

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 agrupación de impresoras está habilitada en Windows NT, puede haber más de un trabajo de impresión despooling desde una cola de impresora que informará de un estado. Este código de ejemplo no tiene en cuenta esa circunstancia.

Referencias

Para obtener información adicional acerca de instrucciones generales en llamar a funciones de cola de Win32, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
158828Cómo la enumeración de cola de llamadas Win32 API correctamente

Propiedades

Id. de artículo: 160129 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 4.1
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface sobre las siguientes plataformas
    • 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
Palabras clave: 
kbmt kbfaq kbhowto KB160129 KbMtes
Traducción automática
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

Enviar comentarios

 

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