Comment faire pour obtenir le statut d'une imprimante et un travail d'impression

Traductions disponibles Traductions disponibles
Numéro d'article: 160129 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

L'état des imprimantes et des travaux d'impression sont mis à jour par le spouleur Win32 au cours de despool d'un travail d'impression. Toutes les autres fois, lorsque cette imprimante est ne pas despooling et rapports aucune information d'état, l'imprimante n'est considérée comme pour être prêt et inactives.

Plus d'informations

Visée par l'API Win32, « imprimante » se compose de l'imprimante pilote, la file d'impression et le chemin d'accès d'entrée/sortie à l'imprimante physique. Le système d'exploitation traite une imprimante physique simplement la destination un travail d'impression générée par et à travers un système « Imprimante », visé à dans le reste de cet article sous la forme d'une imprimante.

La partie la plus visible d'une imprimante est une file d'impression. Il est géré par le Imprimer gestionnaire ou les dossiers de l'imprimante de l'utilisateur de Windows 95-style interfaces. Le pilote d'imprimante est l'interface de l'imprimante utilisée par les applications pour créer des travaux d'impression via imprimante contrôleurs de domaine. Le chemin d'e/s pour une Imprimante se compose de plusieurs couches de code système sanctionnée par un port Moniteur.

Le moniteur de port est l'interface à l'imprimante physique au bas- fin d'un imprimante de système de flux et est responsable de transfert de données d'un travail d'impression sur n'importe quelle connexion existe à l'imprimante physique. Dans le cas des imprimantes bidirectionnelles, le moniteur de port serait responsable du transfert des données vers et à partir de l'imprimante physique. Ceci connexion et l'imprimante physique, sont où des erreurs se produisent. Il s'agit de la tâche du moniteur de port pour signaler ces erreurs.

Le spouleur n'interroge pas l'état d'une imprimante physique sur lequel un Imprimante est connectée. En revanche, l'état d'une imprimante physique détermine la réussite d'un travail d'impression au moment où il est despooled sur le port Moniteur. Si une erreur se produit dans ce processus, l'erreur est signalée par le Moniteur de port et enregistrée dans les informations d'état d'un travail d'impression. Le spouleur à son tour, propage les informations d'erreur raisonnable pour la file d'impression.

Par conséquent, un système imprimante ne signale aucun statut lorsque la file d'attente de l'imprimante est vide. Dans cet état, l'imprimante est supposé prêt à accepter des travaux d'impression. Il s'agit d'une hypothèse valide même si l'imprimante physique est une erreur l'état comme off-line. Le système d'exploitation considère que l'imprimante prêt à accepter les travaux d'impression même si, pour une raison quelconque, il ne peut pas effectuer la remise à l'imprimante physique. Une telle circonstance est considéré comme un état d'erreur dans le système d'exploitation qui doivent être traité par l'utilisateur. Il n'est pas considérée comme une erreur à présenter à l'application est autorisée à réussir la mise en attente du travail d'impression.

Détermination de l'état d'une imprimante physique

Il y a un principe fondamental que doit avoir la valeur true pour déterminer l'état d'une imprimante physique : le spouleur doit tenter d'envoyer un travail d'impression à l'imprimante physique. C'est le seul moment où que l'état de l'imprimante est signalé par le moniteur de port. En outre, les informations plus pertinentes peuvent être signalées dans les membres de l'état d'une structure JOB_INFO pour ce travail d'impression particulière, car certains moniteur de port va avoir défini ces valeurs directement.

Les structures JOB_INFO contiennent un état membre et un membre pStatus . Les deux membres contiennent des informations sur l'état du travail d'impression signalé par le moniteur de port. Ces deux membres diffèrent dans la mesure où l'état membre est un champ de bits des États qui contient des valeurs prédéterminées, tandis que le membre pStatus est un pointeur vers une chaîne qui peut contenir pratiquement n'importe quoi. Ces valeurs sont précisées par le Kit de développement Win32 et le fichier d'en-tête WinSpool.h. Le membre pStatus est parfois mais pas toujours défini à une chaîne d'état descriptif. Le contenu de cette chaîne est défini par chaque moniteur de port.

Structures JOB_INFO sont retournés par les deux fonctions d'API: GetJob et EnumJobs. EnumJobs renvoie un tableau de structures JOB_INFO sans exiger que la référence de l'appelant un travail particulier dans la file d'impression. Le travail d'impression qui est actuellement despooling (impression) contient les informations d'état. Pour accéder à cette tâche dans le tableau, recherche dans le tableau de structures JOB_INFO pour localiser le travail d'impression dont le membre de statut a la JOB_STATUS_PRINTING bit défini.

Une méthode plus facile de déterminer l'état de l'imprimante est d'examiner l'état membre d'une structure PRINTER_INFO . Cette structure est retournée par la fonction GetPrinter . Il existe un inconvénient de cette approche dans la mesure où il n'existe aucun membre de la chaîne pStatus dans une structure PRINTER_INFO qui pourrait fournir des informations plus détaillées ou sur l'état. Cependant, il existe un avantage dans la mesure où un moniteur de port peut définir certaines de l'imprimante plus étendue bits d'état de la structure PRINTER_INFO . Notez que le moniteur de port par défaut pour Windows ne généralement définit pas plus que le bit PRINTER_STATUS_ERROR du membre de statut d'une imprimante.

Notez que les membres de l'état de chacun des ensembles de structures peuvent contenir d'état informations qui ne sont pas strictement liées à l'imprimante physique. Pour exemple, l'état des membres des structures PRINTER_INFO peuvent être définie avec PRINTER_STATUS_PAUSED ou PRINTER_STATUS_PENDING_DELETIONstrictement pertinents pour la file d'attente d'impression. En outre, l'état des membres de la structure JOB_INFO peuvent contenir des valeurs d'état pour JOB_STATUS_PAUSED ou JOB_STATUS_DELETINGqui ne concernent que ce travail d'impression particulière. En outre, notez que les travaux d'impression peuvent s'accumuler dans une file d'attente d'impression après que qu'ils ont despooled et serait plus avec un état de JOB_STATUS_PRINTED.

Chacune de ces fonctions nécessite un handle vers une imprimante pour identifier les Imprimante souhaitée. Ce handle est obtenu à partir de la fonction OpenPrinter qui accepte une chaîne contenant le nom de l'imprimante. Ce nom peut être le nom local de l'imprimante ou un chemin UNC partagé à une imprimante réseau.

L'exemple de code suivant montre comment appeler la fonction EnumJobs correctement pour récupérer des structures JOB_INFO et comment appeler la fonction GetPrinter pour récupérer des structures PRINTER_INFO :

Exemple de 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;

   }
				
Remarque: lorsque le pool d'imprimante est activé sur Windows NT, il peut y avoir plus d'un travail d'impression despooling à partir d'une file d'attente de l'imprimante signale un état. Cet exemple de code ne tient pas compte de ces circonstances.

Références

Pour plus d'informations sur les instructions générales sur l'appel de fonctions Win32 spouleur, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
158828L'énumération appel Wind32 spouleur API correctement

Propriétés

Numéro d'article: 160129 - Dernière mise à jour: lundi 15 octobre 2012 - Version: 6.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Application Programming Interface sur le système suivant
    • 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 Édition Développeur
    • Microsoft Windows 95
Mots-clés : 
kbfaq kbhowto kbmt KB160129 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 160129
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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