Yazıcı ve yazdırma işinin durumunu nasıl edinilir

Makale çevirileri Makale çevirileri
Makale numarası: 160129 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Yazıcıları ve yazdırma işlerinin durumunu güncelleştirilir tarafından Win32 biriktirici yazdırma işi despool ilgili olarak sırasında. Yazıcı despooling olur ve hiçbir durum bilgisini raporlar, tüm diğer zamanlarda, yazıcının hazır ve boşta kalma kabul edilir.

Daha fazla bilgi

Win32 APı'tarafından başvurulan gibi "yazıcı" yazıcı sürücüsü, yazdırma sırasını ve giriş/çıkış yolu fiziksel yazıcı için oluşur. Işletim sistemi, fiziksel bir yazıcı tarafından oluşturulan ve bir yazıcı olarak bu makalenin geri kalanında olarak anılacaktır "Yazıcı" bir sistem geçtiğini yazdırma işinin yalnızca hedef olarak değerlendirir.

En görünür bir yazıcı yazdırma sırasının parçasıdır. Yazdırma Yöneticisi'ni veya Windows 95 stili kullanıcı arabirimleri yazıcı klasörlerinde tarafından yönetiliyor. Yazıcı sürücüsü DC'ler yazıcı ile yazdırma işlerini oluşturmak için kullanılan uygulama tarafından yazıcıya arabirimdir. Bir yazıcı için g/Ç yolu sistem kod ile bir bağlantı noktası izleyicisini culminating birkaç katmanları içerir.

Bağlantı noktası izleyicisi bir sistem yazıcı aşağı akış sonunda fiziksel yazıcı için bir arabirim ve fiziksel yazıcı için ne olursa olsun bağlantı var üzerinden yazdırma işinin veri aktarmak için sorumludur. Çift yönlü yazıcı bağlantı noktası izleyicisi ve fiziksel yazıcı için veri aktarmak için sorumlu olur. Bu bağlantıyı ve fiziksel yazıcıda, burada hataları oluşuyor var. Bu, bu hataları bildirmek için bağlantı noktası izleyicisi'nin işi olur.

Biriktirici yazıcı bağlı olduğu fiziksel yazıcının durumunu sorgula. Bunun yerine, bağlantı noktası izleyicisini despooled anda yazdırma işinin başarılı bir fiziksel yazıcının durumunu belirler. Bu işlem sırasında bazı hata ortaya çıkarsa, hata bağlantı noktası izleyicisi tarafından bildirilen ve yazdırma projenin durum bilgileri kaydedilir. Biriktirici, sırayla, yazıcı sırası için uygun hata bilgilerini yayar.

Sonuç olarak, yazıcı sırası boş olduğunda bir sistem yazıcı yok durumu bildirdi. Bu durumda, yazıcı, yazdırma işlerini kabul etmeye hazır varsayılır. Fiziksel yazıcıda bir hata olsa bile, bu geçerli bir varsayımı, çevrimdışı olarak belirtin. Işletim sistemi herhangi bir nedenle fiziksel yazıcı için teslimat tamamlanamıyor olsa bile, yazdırma işlerini kabul etmeye hazır yazıcı dikkate alır. Işlemin üstlenmesine böyle bir durum, bir kullanıcı tarafından belirtilen işletim sistemi hata durumunda olarak kabul edilir. Bu hata, yazdırma işini biriktirme işleminin başarıyla tamamlanabilmesi için izin verilen uygulama reportable nitelendirilmez.

Bir fiziksel yazıcının durumunu belirleme

Bir fiziksel yazıcının durumunu belirlemek için doğru olması gereken bir temel premise vardır: Biriktirici fiziksel yazıcıya yazdırma işi göndermek çalışıyor gerekir. Bu yazıcının durumunu bağlantı noktası izleyicisi tarafından bildirilen tek zamandır. Buna ek olarak, bazı bağlantı noktası izleyicisi bu değerleri doğrudan ayarladınız, çünkü en anlamlı bilgiler bir JOB_INFO yapısı, belirli bir yazdırma işinin durumunu üyeleri raporlanabilir.

JOB_INFO yapıları Durum üye ve pStatus üye içerir. Her iki üyesi, bağlantı noktası izleyicisi tarafından bildirilen bir yazdırma işinin durumu bilgilerini içerir. Hemen hemen her şeyi içerebilir dize işaretçisi pStatus üye olduğu sırada, önceden belirlenmiş değerleri içeren bir bit alanı durumları Durum üyesiyse, bu iki üye farklı. Bu değerler, Win32 SDK ve WinSpool.h üstbilgi dosyası belgelenmiştir. Bazen, ancak her zaman pStatus üye bir tanımlayıcı durum dizesi olarak ayarlanır. Bu dize içeriği, her bağlantı noktası izleyicisi tarafından tanımlanır.

Iki API işlevi tarafından döndürülen JOB_INFO yapıları: GetJob ve EnumJobs. EnumJobs JOB_INFO yapıları dizisi gerek kalmadan, arayanın başvurusunu belirli bir iş yazıcı sırasında verir. Geçerli (yazdırma) despooling yazdırma işini, durum bilgileri içerir. Bu işlem dizesi içinde bulmak için <a0></a0>, yazdırma işini JOB_STATUS_PRINTING bit kümesi olan durum üyenin bulmaya JOB_INFO yapıları dizisi arayın.

Yazıcı durumu belirleme bir daha kolay PRINTER_INFO yapısının durum üye incelemek için yöntemidir. Bu yapı GetPrinter işlevi tarafından döndürülür. Daha ayrıntılı veya kapsamlı durum bilgileri sağlayabilir PRINTER_INFO yapısında hiçbir pStatus dize üyesini, bu yaklaşımın bir olumsuz yanı vardır. Ancak, bir yararı yoktur, bir bağlantı noktası izleyicisi daha kapsamlı yazıcı bazıları PRINTER_INFO yapısının durum bitleri ayarlanmış. Ancak, Windows varsayılan bağlantı noktası monitörü genellikle en az bir yazıcının durum üyenin PRINTER_STATUS_ERROR kill bitini ayarlamaz olduğunu unutmayın.

Not yapıları ya da bir dizi durum üyeleri kesinlikle fiziksel yazıcı için ilgili durum bilgilerini içerebilir. Örneğin, durumu üye PRINTER_INFO yapıları PRINTER_STATUS_PAUSED veya yazdırma sırası için kesinlikle ilgili PRINTER_STATUS_PENDING_DELETION, ayarlanmış olabilir. Ayrıca, durum üye JOB_INFO yapısının JOB_STATUS_PAUSED veya yalnızca o belirli yazdırma işleriyle ilgili olmayan JOB_STATUS_DELETING, durum değerleri içerebilir. Ayrıca, despooled ve JOB_STATUS_PRINTED durumuyla sol sonra yazdırma işlerini bir yazdırma sırasına birikebilecek unutmayın.

Bu işlevlerden her biri için bir yazıcı istediğiniz yazıcı tanımlamak için bir tanıtıcı gerektirir. Bu tanıtıcı, yazıcının adını içeren bir dize olarak kabul eden OpenPrinter işlevinden alınır. Bu adı ya da yerel ad yazıcının olabilir veya bir UNC adı bir ağ yazıcısına paylaşın.

Aşağıdaki örnek kodu JOB_INFO yapılarını düzgün almaya EnumJobs işlevini çağırın ve PRINTER_INFO yapıları almak için GetPrinter işlevini çağırmak üzere gösterir:

Örnek kod

   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;

   }
				
Not: Windows NT'DE yazıcı havuzunu etkinleştirildiğinde olabilir birden fazla yazdırma işi durumu bildireceği yazıcı sıradan despooling. Bu örnek kod durumunda, üreticiye güvendiğinizi doğrulamak zorunda dikkate almaz.

Referanslar

Win32 biriktirici işlevlerinin çağrılırken genel yönergeler hakkında ek bilgi için Microsoft Knowledge Base'deki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
158828Apı çağrısı Wind32 biriktiricisi numaralandırma nasıl düzgün

Özellikler

Makale numarası: 160129 - Last Review: 21 Kasım 2006 Salı - Gözden geçirme: 4.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • 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
Anahtar Kelimeler: 
kbmt kbfaq kbhowto KB160129 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:160129

Geri Bildirim Ver

 

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