Bagaimana untuk mendapatkan status printer dan pekerjaan pencetakan

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 160129 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Status printer dan pekerjaan pencetakan diperbarui oleh Win32 Spooler selama despool pekerjaan pencetakan. Di lain kali, ketika itu printer adalah tidak despooling dan laporan tidak ada informasi negara, printer dianggap harus siap dan siaga.

INFORMASI LEBIH LANJUT

Seperti yang disebut oleh Win32 API, "printer" terdiri dari printer driver, antrian pencetakan, dan jalur input/output ke printer fisik. Sistem operasi memperlakukan printer fisik sebagai hanya tujuan pekerjaan pencetakan yang dihasilkan oleh dan melewati sistem "Printer," yang disebut di seluruh artikel ini sebagai Printer.

Bagian yang paling terlihat dari Printer adalah antrian pencetakan. Dikelola oleh Cetak Manager atau Printer folder dalam pengguna Windows 95-gaya antarmuka. Pengandar printer adalah antarmuka ke Printer yang digunakan oleh aplikasi untuk menciptakan cetak pekerjaan melalui printer DC. Jalur I/O untuk Printer terdiri dari beberapa lapisan sistem kode berpuncak dengan port monitor.

Port monitor adalah antarmuka ke printer fisik di bawah- Streaming akhir sistem Printer dan bertanggung jawab untuk mentransfer data pencetakan di hubungan apa pun ada ke printer fisik. Dalam kasus di bi-directional printer, port monitor akan bertanggung jawab untuk mentransfer data ke dan dari printer fisik. Ini sambungan, dan printer fisik, adalah di mana kesalahan terjadi. Ini adalah pekerjaan port monitor untuk melaporkan kesalahan-kesalahan.

The Spooler tidak query untuk negara printer fisik yang Printer tersambung. Sebaliknya, negara printer fisik menentukan keberhasilan pencetakan pada waktu itu adalah despooled pelabuhan monitor. Jika beberapa kesalahan terjadi dalam proses ini, kesalahan yang dilaporkan oleh Port monitor dan tercatat dalam informasi status pekerjaan cetak. Spooler, pada gilirannya, menjalar masuk akal kesalahan informasi ke antrian Printer.

Akibatnya, sistem Printer laporan status tidak ketika antrian Printer kosong. Dalam keadaan ini, Printer diasumsikan siap untuk menerima pekerjaan pencetakan. Ini adalah asumsi berlaku bahkan jika printer fisik dalam kesalahan negara seperti off-line. Sistem operasi menganggap Printer siap untuk menerima pekerjaan pencetakan bahkan jika, untuk beberapa alasan, itu tidak dapat menyelesaikan pengiriman untuk printer fisik. Keadaan seperti ini dianggap sebagai kesalahan negara di sistem operasi yang harus diatasi oleh pengguna. Tidak dianggap sebagai kesalahan reportable untuk aplikasi yang diperbolehkan untuk menyelesaikan pengumpulan tugas mencetak berhasil.

Menentukan keadaan fisik Printer

Ada satu premis dasar yang benar untuk menentukan negara printer fisik: the Spooler harus mencoba untuk mengirim pekerjaan pencetakan ke printer fisik. Ini adalah satu-satunya waktu negara printer dilaporkan oleh port monitor. Selain itu, informasi yang paling bermakna mungkin dilaporkan dalam status anggota JOB_INFO struktur untuk tugas mencetak tertentu karena beberapa port monitor akan telah menetapkan nilai-nilai ini secara langsung.

The JOB_INFO struktur berisi Status anggota dan pStatus anggota. Anggota kedua berisi informasi status pekerjaan cetak dilaporkan oleh port monitor. Dua anggota berbeda dalam yang Status anggota adalah medan bit Serikat yang berisi nilai-nilai yang telah ditetapkan, sementara pStatus anggota adalah pointer ke string yang bisa berisi apa saja. Nilai-nilai ini didokumentasikan oleh Win32 SDK dan WinSpool.h header file. The pStatus anggota kadang-kadang, tetapi tidak selalu, diatur untuk string status deskriptif. Isi string ini didefinisikan oleh masing-masing port monitor.

JOB_INFO struktur kembali oleh dua fungsi API: GetJob dan EnumJobs. EnumJobs mengembalikan sebuah array JOB_INFO struktur tanpa memerlukan pemanggil referensi pekerjaan tertentu dalam antrian Printer. Pekerjaan pencetakan yang saat ini adalah despooling (percetakan) berisi informasi status. Untuk menemukan pekerjaan ini dalam array, Cari array JOB_INFO struktur untuk mencari pekerjaan pencetakan yang Status anggota telah JOB_STATUS_PRINTING sedikit ditetapkan.

Metode yang lebih mudah untuk menentukan printer status adalah untuk memeriksa Status anggota PRINTER_INFO struktur. Struktur ini kembali oleh GetPrinter fungsi. Ada kerugian untuk pendekatan ini bahwa ada tidak ada pStatus anggota string PRINTER_INFO struktur yang mungkin memberikan lebih rinci atau luas negara. Namun, ada keuntungan bahwa port monitor dapat menetapkan beberapa printer lebih luas bit status PRINTER_INFO struktur. Namun, perlu diketahui bahwa standar port monitor untuk Windows tidak biasanya ditetapkan lebih dari PRINTER_STATUS_ERROR sedikit Printer Status anggota.

Perhatikan bahwa anggota Status baik set struktur mungkin mengandung negara informasi yang tidak benar-benar berhubungan dengan printer fisik. Untuk contoh, Status anggota PRINTER_INFO struktur dapat menetapkan dengan PRINTER_STATUS_PAUSED atau PRINTER_STATUS_PENDING_DELETION, benar-benar relevan dengan antrian cetak. Juga, Status anggota JOB_INFO struktur mungkin berisi nilai-nilai negara untuk JOB_STATUS_PAUSED atau JOB_STATUS_DELETING, hanya relevan untuk cetak tugas tertentu. Perlu diketahui juga, bahwa pekerjaan pencetakan dapat menumpuk di antrian cetak setelah mereka telah despooled dan akan meninggalkan dengan keadaan JOB_STATUS_PRINTED.

Masing-masing fungsi-fungsi ini memerlukan pegangan untuk printer untuk mengidentifikasi Printer yang diinginkan. Pegangan ini Diperoleh dari OpenPrinter fungsi, yang menerima string yang berisi nama printer. Nama ini dapat menjadi salah satu nama lokal printer atau UNC berbagi nama ke printer jaringan.

Dalam kode contoh berikut menunjukkan bagaimana memanggil EnumJobs fungsi dengan benar untuk mengambil JOB_INFO struktur dan bagaimana untuk panggilan GetPrinter fungsi untuk mengambil PRINTER_INFO struktur:

Contoh kode

   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;

   }
				
CATATAN: Ketika printer penggabungan diaktifkan pada Windows NT, mungkin ada lebih dari satu despooling pekerjaan pencetakan dari antrian Printer yang akan melaporkan status. Kode contoh ini tidak mempertimbangkan bahwa keadaan.

REFERENSI

Untuk informasi tambahan tentang petunjuk umum pada menelepon Win32 Spooler fungsi, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
158828Bagaimana untuk panggilan Wind32 Spooler enumerasi api dengan benar

Properti

ID Artikel: 160129 - Kajian Terakhir: 15 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Win32 Application Programming Interface, ketika digunakan dengan:
    • 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
Kata kunci: 
kbFAQ kbhowto kbmt KB160129 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:160129

Berikan Masukan

 

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