Làm th? nào đ? có đư?c t?nh tr?ng c?a máy in và công vi?c in

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 160129 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

T?nh tr?ng c?a máy in và các công vi?c in đư?c C?p Nh?t b?i b? đ?m Win32 trong th?i gian despool công vi?c in. T?i t?t c? các th?i đi?m khác, khi mà máy in là không despooling và báo cáo không có thông tin tr?ng thái, máy in đư?c coi là đ? s?n sàng và nhàn r?i.

THÔNG TIN THÊM

Như g?i b?i Win32 API, "máy" bao g?m máy in tr?nh đi?u khi?n hàng ch? in và đ?u vào/đ?u ra đư?ng d?n đ?n máy in v?t l?. H? đi?u hành x? l? máy in v?t l? như ch? đơn thu?n là đi?m đ?n c?a công vi?c in đư?c t?o ra b?i và truy?n thông qua m?t h? th?ng "Máy in," y cyfeirir ato trong ph?n c?n l?i c?a bài vi?t này như là m?t máy in.

Ph?n m?t máy in, d? th?y nh?t là m?t hàng ch? in. Nó đư?c qu?n l? b?i các In qu?n l? ho?c c?p máy in dùng Windows 95-phong cách giao di?n. Tr?nh đi?u khi?n máy in là giao di?n t?i máy in đư?c s? d?ng b?i các ?ng d?ng đ? t?o ra công vi?c in thông qua máy in DCs. Đư?ng d?n I/O cho m?t Máy in bao g?m nhi?u l?p h? th?ng m? mà đ?nh cao v?i m?t c?ng màn h?nh.

Tr?nh giám sát c?ng là giao di?n đ?n máy in v?t l? t?i xu?ng- d?ng k?t thúc c?a m?t h? th?ng máy in và có trách nhi?m chuy?n d? li?u c?a công vi?c in qua k?t n?i b?t c? đi?u g? t?n t?i đ? máy in v?t l?. Trong trư?ng h?p c?a bi-directional máy in, tr?nh giám sát c?ng s? ch?u trách nhi?m chuy?n d? li?u đ?n và t? máy in v?t l?. Đi?u này k?t n?i, và máy in th? ch?t, là nơi x?y ra l?i. Nó là công vi?c c?a tr?nh giám sát c?ng đ? báo cáo nh?ng l?i.

B? đ?m truy v?n không cho nhà nư?c c?a m?t máy in v?t ch?t mà m?t Máy in đư?c k?t n?i. Thay vào đó, nhà nư?c c?a máy in v?t l? xác đ?nh s? thành công c?a công vi?c in vào th?i đi?m đó là despooled trên c?ng màn h?nh. N?u m?t s? l?i x?y ra trong quá tr?nh này, l?i là báo cáo c?a các c?ng theo d?i và ghi l?i trong công vi?c in thông tin tr?ng thái. B? đ?m, l?n lư?t, Lan truy?n thông tin h?p l? l?i vào các hàng ch? máy in.

Do đó, m?t h? th?ng máy in báo cáo t?nh tr?ng không có khi hàng đ?i máy in có s?n ph?m nào. Tieåu bang naøy, máy in gi? đ?nh s?n sàng ch?p nh?n các công vi?c in ?n. Đây là m?t gi? đ?nh h?p l? th?m chí n?u máy in v?t l? trong m?t l?i nhà nư?c như off-line. H? đi?u hành s? xem xét máy in đ? s?n sàng đ? ch?p nh?n các công vi?c in ngay c? khi, cho m?t s? l? do, nó không th? hoàn t?t đư?c giao cho máy in v?t l?. M?t trư?ng h?p như v?y đư?c coi là m?t nhà nư?c l?i trong h? đi?u hành ph?i đư?c gi?i quy?t b?i ngư?i s? d?ng. Nó không ph?i là đư?c coi là m?t l?i reportable t?i ?ng d?ng đư?c phép hoàn t?t spooling vi?c in thành công.

Vi?c xác đ?nh nhà nư?c c?a v?t l? máy in

Đó là m?t trong nh?ng ti?n đ? cơ b?n mà ph?i đúng đ? xác đ?nh nhà nư?c c?a m?t máy in v?t l?: b? đ?m ph?i c? g?ng g?i cho công vi?c in đ? máy in v?t l?. Đây là l?n duy nh?t c?a máy in báo cáo c?a tr?nh giám sát c?ng. Ngoài ra, các thông tin có ? ngh?a nh?t có th? đư?c báo cáo t?nh tr?ng các thành viên c?a m?t JOB_INFO cơ c?u t? ch?c cho r?ng vi?c in c? th? b?i v? m?t s? tr?nh giám sát c?ng s? đ? thi?t l?p các giá tr? tr?c ti?p.

Các JOB_INFO c?u trúc ch?a m?t Tr?ng thái thành viên và m?t pStatus thành viên. C? hai thành viên ch?a thông tin tr?ng thái c?a công vi?c in báo cáo c?a tr?nh giám sát c?ng. Hai thành viên khác trong đó các Tr?ng thái thành viên là m?t trư?ng k? có ch?a các giá tr? đ?nh trư?c, trong khi các pStatus thành viên là m?t con tr? đ?n m?t chu?i có th? ch?a ch? là v? b?t c? đi?u g?. Các giá tr? này đ? đư?c di?n t? b?ng Win32 SDK và t?p tin tiêu đ? WinSpool.h. Các pStatus thành viên đôi khi, nhưng không ph?i luôn luôn, đ?t m?t chu?i mô t? tr?ng thái. N?i dung c?a chu?i này đư?c đ?nh ngh?a b?i m?i tr?nh giám sát c?ng.

JOB_INFO c?u trúc đư?c tr? v? b?i hai API ch?c năng: GetJob và EnumJobs. EnumJobs tr? l?i m?t m?ng c?a JOB_INFO c?u trúc mà không yêu c?u ngư?i g?i tham kh?o m?t công vi?c c? th? trong hàng đ?i máy in. Công vi?c in hi?n nay despooling (in ?n) ch?a thông tin tr?ng thái. Đ? t?m công vi?c này trong m?ng đó, t?m ki?m các m?ng JOB_INFO c?u trúc đ? xác đ?nh v? trí công vi?c in mà thành viên t?nh tr?ng có JOB_STATUS_PRINTING chút t?p.

M?t phương pháp d? dàng xác đ?nh t?nh tr?ng máy in là đ? ki?m tra t?nh tr?ng thành viên c?a m?t PRINTER_INFO c?u trúc. C?u trúc này tr? l?i do các GetPrinter ch?c năng. Đó là m?t b?t l?i cho cách ti?p c?n này trong đó có không có pStatus tài kho?n c?a chu?i ? m?t PRINTER_INFO c?u trúc có th? cung c?p thông thêm chi ti?t ho?c r?ng r?i tin nhà nư?c. Tuy nhiên, đó là m?t l?i th? trong đó m?t tr?nh giám sát c?ng có th? thi?t l?p m?t s? máy in r?ng r?i hơn t?nh tr?ng bit c?a các PRINTER_INFO c?u trúc. Lưu ?, tuy nhiên, r?ng tr?nh giám sát c?ng m?c đ?nh cho Windows không thư?ng đ?t nhi?u hơn các PRINTER_STATUS_ERROR bit c?a tài kho?n c?a t?nh tr?ng c?a máy in.

Lưu ? r?ng các thành viên t?nh tr?ng c?a m?t trong hai t?p c?a các c?u trúc có th? ch?a các nhà nư?c thông tin đó không nghiêm ch?nh liên quan đ?n máy in v?t l?. Cho Ví d?, thành viên t?nh tr?ng c?a các PRINTER_INFO các c?u trúc có th? đư?c thi?t l?p v?i PRINTER_STATUS_PAUSED ho?c PRINTER_STATUS_PENDING_DELETION, đó là có liên quan ch?t ch? đ?n hàng ch? in. Ngoài ra, thành viên t?nh tr?ng c?a các JOB_INFO c?u trúc có th? ch?a các giá tr? nhà nư?c cho JOB_STATUS_PAUSED ho?c JOB_STATUS_DELETING, đó là có liên quan ch? cho r?ng vi?c in c? th?. C?ng lưu ?, r?ng các công vi?c in ?n có th? tích l?y trong m?t hàng đ?i in sau khi h? có despooled và s? đư?c trái v?i m?t bang JOB_STATUS_PRINTED.

M?i ngư?i trong s? các ch?c năng này đ?i h?i m?t x? l? cho máy in đ? xác đ?nh các b?n mu?n máy in. Ch?t này thu đư?c t? các OpenPrinter ch?c năng, mà ch?p nh?n m?t chu?i ch?a tên máy in. Tên này có th? là c? hai đ?a phương tên máy in ho?c chia s? UNC m?t tên cho máy in m?ng.

M?u m? sau đây ch?ng t? làm th? nào đ? g?i cho các EnumJobs ch?c năng đúng cách đ? L?y JOB_INFO c?u trúc và làm th? nào đ? g?i cho các GetPrinter ch?c năng đ? L?y PRINTER_INFO c?u trúc:

M?u m?

   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;

   }
				
LƯU ?: Khi h?p nhóm máy in đư?c kích ho?t trên Windows NT, có th? có nhi?u hơn m?t vi?c in despooling t? m?t hàng đ?i máy in s? báo cáo t?nh tr?ng m?t. M? m?u này không xem xét trư?ng h?p đó.

THAM KH?O

Đ? thêm thông tin v? hư?ng d?n chung ngày g?i ch?c năng Win32 Spooler, nh?p vào s? bài vi?t sau đ? xem bài vi?t trong cơ s? ki?n th?c Microsoft:
158828Làm th? nào đ? g?i Wind32 Spooler đ?m các API đúng cách

Thu?c tính

ID c?a bài: 160129 - L?n xem xét sau cùng: 18 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Win32 Application Programming Interface, khi đư?c dùng v?i:
    • 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
T? khóa: 
kbFAQ kbhowto kbmt KB160129 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:160129

Cung cấp Phản hồi

 

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