วิธีการดูสถานะของเครื่องพิมพ์และการพิมพ์งาน

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 160129 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

สถานะของเครื่องพิมพ์และงานพิมพ์ถูกอัพเดตโดย Win32 Spooler ระหว่าง despool ของงานพิมพ์ เลยบางครั้ง เมื่อเครื่องพิมพ์นั้นจะไม่ despooling และรายงานไม่มีข้อมูลสถานะ เครื่องพิมพ์จะถือเป็นพร้อม และไม่ได้ใช้งาน

ข้อมูลเพิ่มเติม

เป็นการอ้างอิง โดย Win32 API เครื่อง "พิมพ์" จะประกอบด้วยโปรแกรมควบคุมเครื่องพิมพ์ คิวการพิมพ์ และอินพุต/เอาท์พุตเส้นทางไปยังเครื่องพิมพ์ที่มีอยู่จริง ระบบปฏิบัติการใช้เครื่องพิมพ์ที่มีอยู่จริงเป็นแค่ปลายทางของงานพิมพ์เกิดขึ้นจาก และการส่งผ่านผ่านระบบ "เครื่องพิมพ์ อ้างอิงถึงในส่วนที่เหลือของบทความนี้เป็นเครื่องพิมพ์

ส่วนที่มองเห็นได้มากที่สุดของเครื่องพิมพ์มีคิวการพิมพ์ จะถูกจัดการ โดยตัวจัดการการพิมพ์หรือโฟลเดอร์เครื่องพิมพ์ที่อยู่ในอินเทอร์เฟซสำหรับผู้ใช้ของลักษณะของ Windows 95 โปรแกรมควบคุมเครื่องพิมพ์ที่อยู่อินเทอร์เฟซไปยังเครื่องพิมพ์ที่ใช้ โดยโปรแกรมประยุกต์ในการสร้างงานพิมพ์โดยใช้เครื่องพิมพ์ DCs เส้นทางของ I/O สำหรับเครื่องพิมพ์ที่ประกอบด้วยรหัสของระบบ culminating กับจอภาพพอร์ตหลายชั้น

จอภาพของพอร์ตที่มีอินเทอร์เฟซไปยังเครื่องพิมพ์ที่มีอยู่จริงที่ท้ายสตรีมลงระบบเครื่องพิมพ์ และรับผิดชอบในการถ่ายโอนข้อมูลของงานพิมพ์ผ่านใด ๆ ก็ตามการเชื่อมต่ออยู่กับเครื่องพิมพ์ที่มีอยู่จริง ในกรณีของเครื่องพิมพ์ bi directional หน้าจอแสดงพอร์ตจะได้รับผิดชอบสำหรับการโอนย้ายข้อมูลเข้า และออก จากเครื่องพิมพ์ที่มีอยู่จริง เชื่อมต่อนี้ และเครื่องพิมพ์ที่มีอยู่จริง ซึ่งข้อผิดพลาดเกิดขึ้น งานของจอภาพพอร์ตเพื่อรายงานข้อผิดพลาดเหล่านั้นได้

ตัวจัดคิวงานที่ไม่ได้แบบสอบถามสำหรับสถานะของเครื่องพิมพ์ที่มีอยู่จริงที่มีการเชื่อมต่อเครื่องพิมพ์ แทน สถานะของเครื่องพิมพ์ที่มีอยู่จริงกำหนดความสำเร็จของงานพิมพ์ในเวลาดังกล่าวคือ despooled บนจอภาพพอร์ต ถ้าเกิดข้อผิดพลาดบางอย่างในกระบวนการนี้ ข้อผิดพลาดคือรายงาน ด้วยหน้าจอแสดงพอร์ต และถูกบันทึกไว้ในข้อมูลสถานะของงานพิมพ์ Spooler แพร่กระจายในกลับ รายละเอียดข้อผิดพลาดที่เหมาะสมลงในคิวของเครื่องพิมพ์

จากนั้นอิทธิพล ระบบเครื่องพิมพ์รายงานสถานะไม่เมื่อคิวเครื่องพิมพ์ว่างเปล่า ในสถานะนี้ เครื่องพิมพ์ที่อยู่สันนิษฐานพร้อมที่จะยอมรับงานพิมพ์ นี่คือ assumption ที่ถูกต้องแม้ว่าเครื่องพิมพ์ที่มีอยู่จริงที่อยู่ในข้อผิดพลาดรัฐเช่น off-line ระบบปฏิบัติการพิจารณาเครื่องพิมพ์พร้อมที่จะยอมรับงานพิมพ์แม้ ด้วยเหตุผลบางประการ นั้นไม่สามารถดำเนินการจัดส่งไปยังเครื่องพิมพ์ที่มีอยู่จริง circumstance กล่าวจะถือเป็นสถานะผิดพลาดในระบบปฏิบัติการที่ต้องได้รับการจัดการ โดยผู้ใช้ คุณจะไม่มีพิจารณาข้อผิดพลาด reportable ไปยังโปรแกรมประยุกต์ที่ได้รับอนุญาตให้เสร็จสมบูรณ์ spooling ของงานพิมพ์

การกำหนดสถานะของเครื่องพิมพ์ที่มีอยู่จริง

ไม่มี premise fundamental หนึ่งที่ต้องเป็นจริงการตรวจสอบสถานะของเครื่องพิมพ์ที่มีอยู่จริง: ตัวจัดคิวงานที่ต้องได้พยายามที่จะส่งงานพิมพ์ไปยังเครื่องพิมพ์ที่มีอยู่จริง ในครั้งเดียวที่มีรายงานสถานะของเครื่องพิมพ์ โดยการตรวจสอบของพอร์ตนี้ได้ นอกจากนี้ อาจจะรายงานข้อมูลที่มีความหมายมากที่สุดในสมาชิกสถานะของคำjob_infoโครงสร้างสำหรับงานการพิมพ์เฉพาะที่ได้เนื่องจากจอภาพบางพอร์ตที่จะมีกำหนดค่าเหล่านี้โดยตรง

กระบวนการjob_infoประกอบด้วยโครงสร้างคำสถานะ:สมาชิก และ apStatusสมาชิก สมาชิกทั้งสองประกอบด้วยข้อมูลสถานะของงานพิมพ์รายงาน โดยจอภาพของพอร์ต สมาชิกสองเหล่านี้แตกต่างกันในที่นี้สถานะ:สมาชิกคือ ฟิลด์บิตของสถานะที่ประกอบด้วยค่า predetermined ในขณะนี้pStatusสมาชิกมีตัวชี้ไปเป็นสายอักขระที่อาจประกอบด้วยเพียงเกี่ยวกับสิ่งใด ค่าเหล่านี้จะได้รับการบันทึกไว้ โดย Win32 SDK และแฟ้มของส่วนหัว WinSpool.h กระบวนการpStatusสมาชิกเป็นบางครั้ง แต่ไม่ได้ตลอด เวลา กำหนดเป็นสายอักขระเป็นคำอธิบายสถานะ เนื้อหาของข้อความนี้ถูกกำหนด โดยแต่ละจอภาพของพอร์ต

job_infoโครงสร้างจะส่งกลับ โดยฟังก์ชัน API ที่สอง: GetJob และ EnumJobs EnumJobs ส่งกลับค่าอาร์เรย์ของjob_infoโครงสร้างโดยไม่ต้องขอให้ผู้เรียกอ้างอิงงานเฉพาะในคิวเครื่องพิมพ์ งานพิมพ์ที่อยู่ในปัจจุบัน despooling (พิมพ์) ประกอบด้วยข้อมูลสถานะ To find this job in the array, search the array ofJOB_INFOstructures to locate the print job whose Status member has the JOB_STATUS_PRINTING bit set.

An easier method of determining the printer status is to examine the Status member of aPRINTER_INFOstructure. This structure is returned by theGetPrinterfunction. There is a disadvantage to this approach in that there is nopStatusstring member in aPRINTER_INFOstructure that might provide more detailed or extensive state information. However, there is an advantage in that a port monitor may set some of the more extensive printer status bits of thePRINTER_INFOstructure. Note, however, that the default port monitor for Windows does not usually set more than thePRINTER_STATUS_ERRORbit of a Printer's Status member.

Note that the Status members of either set of structures may contain state information that is not strictly related to the physical printer. For example, the Status member of thePRINTER_INFOstructures may be set withPRINTER_STATUS_PAUSEDหรือPRINTER_STATUS_PENDING_DELETION, that are strictly relevant to the Print Queue. Also, the Status member of theJOB_INFOstructure may contain state values forJOB_STATUS_PAUSEDหรือJOB_STATUS_DELETING, that are relevant only to that particular print job. Note, also, that print jobs may accumulate in a Print queue after they have despooled and would be left with a state ofJOB_STATUS_PRINTED.

Each of these functions requires a handle to a printer to identify the desired Printer. This handle is obtained from theOpenPrinterfunction, that accepts a string containing the name of the printer. This name can be either the local name of the printer or a UNC share name to a network printer.

The following sample code demonstrates how to call theEnumJobsfunction properly to retrieveJOB_INFOstructures and how to call theGetPrinterfunction to retrievePRINTER_INFOstructures:

Sample 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;

   }
				
หมายเหตุ:: When printer pooling is enabled on Windows NT, there may be more than one print job despooling from a Printer queue that will report a status. This sample code does not consider that circumstance.

ข้อมูลอ้างอิง

For additional information about general instructions on calling Win32 Spooler functions, click the following article number to view the article in the Microsoft Knowledge Base:
158828How To Call Wind32 Spooler enumeration APIs properly

คุณสมบัติ

หมายเลขบทความ (Article ID): 160129 - รีวิวครั้งสุดท้าย: 6 มกราคม 2554 - Revision: 4.0
ใช้กับ
Keywords: 
kbFAQ kbhowto kbmt KB160129 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:160129

ให้ข้อเสนอแนะ

 

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