Làm thế nào để nhận sơ đồ sàn trạm đậu in và các công việc in

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để 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 nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các 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, 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.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 160129
Tóm tắt
trạm đậu của máy in và các công việc in Cập Nhật của Win32 Spoolerduring despool công việc in. Tất cả các lần, khi đó in isnot despooling và báo cáo không có thông tin sơ đồ sàn trạm đậu in là consideredto sẵn sàng và rỗi.
Thông tin thêm
Khi được gọi Win32 API, máy in"" bao gồm printerdriver, hàng đợi in và đường dẫn vào/ra máy in vật lý.hệ điều hành xử lý máy in vật lý chỉ đích ofa lệnh in được tạo ra bởi và qua một hệ thống "In," gọi toin phần còn lại của bài viết này là máy in.

Hầu hết phần máy in là một hàng đợi in. Nó được quản lý bởi thePrint quản lý hoặc cặp máy in trong Windows 95-phong cách userinterfaces. Trình trình điều khiển máy in là giao diện máy in có usedby ứng dụng để tạo ra các công việc in qua in DC. Đường I/O cho aPrinter bao gồm nhiều lớp mã hệ thống mà đỉnh cao với một portmonitor.

Giám sát cổng giao diện vật lý in xuống dòng cuối của hệ thống máy in và chịu trách nhiệm chuyển dataof công việc in trên bất kỳ kết nối có thể in.Trong trường hợp bi hướng máy in, màn hình cổng sẽ beresponsible để chuyển dữ liệu đến và từ máy in vật lý. Thisconnection và vật lý máy in là nơi xảy ra lỗi. Đó là jobof giám sát cổng báo cáo các lỗi.

Bộ đệm không truy vấn trạm đậu của máy in vật lý mà aPrinter được kết nối. Thay vào đó, trạm đậu của công lý in determinesthe các công việc in lúc rồi despooled portmonitor. Nếu một số hiệu lỗi xảy ra trong quá trình này, lỗi được báo cáo theport màn hình và ghi lại trong công việc in thông tin trạm đậu. Bộ đệm, Lan truyền thông tin hợp lý lỗi hàng đợi in.

Do đó, Hệ thống in báo cáo trạm đậu không khi hàng đợi máy in isempty. Ở sơ đồ sàn trạm đậu in cho sẵn sàng để chấp nhận các công việc in.Đây là một giả định giá trị ngay cả khi máy in vật lý trong một errorstate như ngoại tuyến. hệ điều hành xem xét máy in sẵn sàng toaccept công việc in ngay, vì một số lý do, nó không thể hoàn tất gửi tới máy in vật lý. Một trường hợp là một trạm đậu lỗi trong hệ điều hành phải được giải quyết bởi người dùng. Đó là notconsidered lỗi reportable ứng dụng phép tocomplete đệm công việc in thành công.

Xác định trạm đậu của máy in vật lý

Có một chỗ cơ bản phải đúng để xác định máy in vật lý bác: bộ đệm phải cố gắng gửi jobto in in vật lý. Đây là chỉ theo dõi trạm đậu của máy in isreported bằng cổng. Ngoài ra, informationmay có ý nghĩa nhất được báo cáo trong tình trạng các thành viên của một cấu trúc JOB_INFO cho công việc in cụ thể là do một số màn hình cổng sẽ đặt các giá trị trực tiếp.

Cấu trúc JOB_INFO chứa một trạm đậu và một thành viên pStatus . Thành viên đều có thông tin trạm đậu của công việc in báo cáo Giám sát cổng. Hai thành viên khác trong là thành viên trạm đậu chút trường quốc gia có định giá trị, trong khi các thành viên pStatus con trỏ đến một chuỗi có thể chỉ là về bất cứ điều gì. Các giá trị được ghi lại bởi Win32 SDK và các tập tin tiêu đề WinSpool.h. Thành viên pStatus đôi khi, nhưng không phải luôn luôn nằm một chuỗi mô tả trạm đậu. Nội dung của chuỗi này được xác định bởi mỗi màn hình cổng.

Cấu trúc JOB_INFO được trả lại bởi hai API chức năng: GetJob và EnumJobs. EnumJobs trả lại một loạt các JOB_INFO cấu trúc mà không cần có tài liệu tham khảo gọi công việc cụ thể trong hàng đợi in. Công việc in hiện despooling (in) chứa thông tin trạm đậu. Để tìm công việc này trong mảng, tra cứu mảng JOB_INFO cấu trúc tìm công việc in có trạm đậu viên đã thiết lập JOB_STATUS_PRINTING chút.

Một phương pháp dễ dàng hơn để xác định sơ đồ sàn trạm đậu in là kiểm tra Statusmember cấu trúc PRINTER_INFO . Cấu trúc này được trả về chức năng GetPrinter . Đó là bất lợi đến phương pháp này không có tài khoản của chuỗi pStatus theo từng PRINTER_INFO có thể cung cấp thêm chi tiết hoặc mở rộng thông tin trạm đậu. Tuy nhiên, đó là một lợi thế trong màn hình cổng có thể đặt một số lớn hơn in bit trạm đậu của cấu trúc PRINTER_INFO . Lưu ý, Tuy nhiên, rằng giám sát cổng mặc định cho Windows không thường đặt nhiều hơn chút PRINTER_STATUS_ERROR viên sơ đồ sàn trạm đậu in.

Lưu ý rằng trạm đậu các thành viên của một trong hai cấu trúc có thể chứa stateinformation hoàn toàn không liên quan tới máy in vật lý. Forexample, thành viên trạm đậu của cấu trúc PRINTER_INFO có thể được đặt với PRINTER_STATUS_PAUSED hoặc PRINTER_STATUS_PENDING_DELETION, có liên quan chặt chẽ với hàng đợi in. Ngoài ra, thành viên trạm đậu của cấu trúc JOB_INFO có chứa giá trị trạm đậu JOB_STATUS_PAUSED hoặc JOB_STATUS_DELETING, có liên quan chỉ cho công việc in cụ thể đó. Lưu ý Ngoài ra, các công việc in có thể tích lũy trong hàng đợi in sau khi họ có despooled và sẽ là trái với một JOB_STATUS_PRINTED.

Một trong các chức năng yêu cầu trình trình điều khiển máy in để xác định thedesired máy in. Điều khiển này được lấy từ các chức năng OpenPrinter , chấp nhận một chuỗi chứa tên máy in. Tên này có thể hoặc tên máy in cục bộ hoặc chia sẻ UNC một tên máy in mạng.

Mã mẫu sau giải thích cách gọi hàm EnumJobs đúng cách để lấy JOB_INFO cấu trúc và làm thế nào để gọi hàm GetPrinter để lấy PRINTER_INFO cấu trúc:

Mã mẫu

   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 bật trên Windows NT, có thể có nhiều hơn một công việc in despooling từ hàng đợi in sẽ thông báo trạm đậu. Mã mẫu này không xem xét trường hợp đó.
Tham khảo
Để biết thêm thông tin về hướng dẫn chung trên gọi chức năng Win32 đệm, hãy bấm vào số bài viết sau để xem bài viết trong cơ sở kiến thức Microsoft:
158828 Làm thế nào để gọi Wind32 đệm đếm API đúng
GdiSpool

Thuộc tính

ID Bài viết: 160129 - Xem lại Lần cuối: 03/14/2015 09:58:00 - Bản sửa đổi: 3.0

Microsoft Win32 Application Programming Interface

  • kbFAQ kbhowto kbmt KB160129 KbMtvi
Phản hồi