Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 160129
Résumé
L'état des imprimantes et des travaux d'impression sont mis à jour par le Win32 Spoolerduring la despool d'un travail d'impression. À tout autre moment, lorsque cette imprimante isnot désynchronisation et rapports aucune information d'état, l'imprimante n'est consideredto être prêt et inactives.
Plus d'informations
Visée par l'API Win32, une « imprimante » se compose de la printerdriver, la file d'attente à l'impression et le chemin d'accès d'entrée/sortie à l'imprimante physique.Le système d'exploitation traite une imprimante physique que simplement la destination ofa travail d'impression généré par et passés à travers un système « Imprimante », visés àdans le reste de cet article en tant qu'imprimante.

La partie la plus visible d'une imprimante est une file d'attente à l'impression. Il est géré par thePrint Manager ou les dossiers de l'imprimante dans l'userinterfaces de style de Windows 95. Le pilote d'imprimante est l'interface de l'imprimante est applications utilise pour créer des travaux d'impression via l'imprimante contrôleurs de domaine. Le chemin d'e/s d'aPrinter se compose de plusieurs couches de code système sanctionnée par un moniteur de port.

Le moniteur de port est l'interface de l'imprimante à la fin en aval d'un système imprimante physique et est chargé pour le transfert de la dataof un travail d'impression sur n'importe quelle connexion existe à l'imprimante physique.Pour les imprimantes bidirectionnelles, le moniteur de port est beresponsible pour transférer des données vers et à partir de l'imprimante physique. Thisconnection et l'imprimante physique, sont où les erreurs se produisent. Il s'agit de la jobof le moniteur de port pour signaler les erreurs.

Le spouleur n'interroge pas l'état d'une imprimante physique à laquelle est connecté aPrinter. Au lieu de cela, l'état de réussite determinesthe imprimante physique d'un travail d'impression au moment où il est despooled sur le moniteur de port. Si une erreur se produit dans ce processus, l'erreur est signalée par l'analyseur theport et enregistrée dans les informations d'état d'un travail d'impression. Le spouleur, propage à son tour, les informations d'erreur raisonnable à la file d'attente de l'imprimante.

Par conséquent, un système imprimante ne signale aucun état lorsque la fonction isempty de file d'attente de l'imprimante. Dans cet état, l'imprimante est supposé prêt à accepter des travaux d'impression.C'est une hypothèse valide même si l'imprimante physique est une errorstate tels que hors ligne. Le système d'exploitation considère que le toaccept de prêt imprimante les travaux d'impression même si, pour une raison quelconque, il ne peut pas effectuer la remise à l'imprimante physique. Une telle situation est considéré comme un état d'erreur du système d'exploitation qui doivent être résolu par l'utilisateur. Il est notconsidered une erreur à déclarer à l'application qui est autorisé, tocomplete le spoulage du travail d'impression a réussi.

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

Il est un principe fondamental qui doit être true pour déterminer le stateof une imprimante physique : le spouleur doit tenter d'envoyer un jobto d'impression à l'imprimante physique. Il s'agit de la seule fois où l'état de l'imprimante isreported par le port de contrôle. En outre, la forme la plus pertinente informationmay signalées dans les membres de l'état d'une structure JOB_INFO pour ce travail d'impression particulier car certains moniteur de port ont définirez ces valeurs directement.

Les structures JOB_INFO contiennent un membre d'état et pStatus . Les deux membres contiennent des informations sur l'état d'un travail d'impression a signalé par le moniteur de port. Ces deux membres diffèrent en ce que l'état des membres sont un champ de bits d'États qui contient les 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 sur 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ées par les deux fonctions de l'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'attente de l'imprimante. Le travail d'impression est actuellement désynchronisation (impression) qui contient les informations d'état. Pour trouver ce travail dans le tableau, recherchez le tableau de structures JOB_INFO pour localiser le travail d'impression dont le membre état possède le jeu JOB_STATUS_PRINTING bits.

Une méthode plus simple de détermination de l'état de l'imprimante consiste à examiner la Statusmember 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 chaîne de pStatus dans une structure PRINTER_INFO qui peut fournir des informations d'état plus détaillées ou. Toutefois, 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, cependant, que le moniteur de port par défaut pour Windows ne définit pas de généralement plus que le bit PRINTER_STATUS_ERROR de l'état des membres d'une imprimante.

Notez que les membres de l'état d'un ensemble de structures peuvent contenir stateinformation n'est pas strictement liée à l'imprimante physique. Par exemple, l'état des membres des structures PRINTER_INFO peuvent être défini avec PRINTER_STATUS_PAUSED ou PRINTER_STATUS_PENDING_DELETION, qui sont strictement pertinentes à 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_DELETING, qui ne concernent que ce travail d'impression particulier. Notez, par ailleurs, que les travaux d'impression peuvent s'accumuler dans une file d'attente d'impression après que qu'ils ont despooled et resterait avec un état de JOB_STATUS_PRINTED.

Chacune de ces fonctions nécessite un handle à une imprimante pour identifier l'imprimante thedesired. 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 partage UNC nom à 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é sous Windows NT, il peut y avoir plus d'une désynchronisation travail d'impression à partir d'une file d'attente d'imprimante qui rapporte un état. Cet exemple de code ne tient pas compte de cette circonstance.
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 :
158828 L'API d'énumération appel Wind32 spouleur correctement
GdiSpool

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 160129 - Dernière mise à jour : 03/14/2015 06:31:00 - Révision : 7.0

Microsoft Win32 Application Programming Interface

  • kbFAQ kbhowto kbmt KB160129 KbMtfr
Commentaires