您目前已離線,請等候您的網際網路重新連線

如何取得印表機和列印工作的狀態

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:160129
結論
印表機與列印工作的狀態會更新 Win32 Spoolerduring despool 的列印工作。在所有其他情況中,當該印表機 isnot despooling 和報表沒有狀態的詳細資訊,印表機是 consideredto 是準備而閒置。
其他相關資訊
如同由 Win32 API,[印表機] 是 printerdriver、 列印佇列中和組成實體印表機的輸入/輸出路徑。所產生的只是目的地的 ofa 列印工作,並透過系統傳送 [印表機],指 toin 為印表機這篇文章的其餘部分,作業系統就會視為實體印表機。

印表機的最明顯的部分是列印佇列。它是由 thePrint 管理員或在 Windows 95 樣式 userinterfaces 中的 [印表機] 資料夾管理。印表機驅動程式是印表機是 usedby 應用程式,以透過印表機 Dc 的列印工作的介面。APrinter 的 I/O 路徑包含了好幾層的系統程式碼時達到最高潮與 portmonitor。

連接埠監視器是系統印表機下資料流結尾的實體印表機的介面,而且是負責透過任何連接存在實體印表機中傳送 dataof 列印工作。如果是雙向印表機連接埠監視器會傳輸資料的實體印表機的 beresponsible。Thisconnection 和實體的印表機,會發生錯誤。它是 jobof 連接埠監視器,來報告這些錯誤。

多工緩衝處理器不會查詢 aPrinter 所連接的實體印表機的狀態。相反地,在時間的列印工作的實體印表機 determinesthe 成功的狀態超出了 despooled portmonitor。如果在此程序中發生某些錯誤,錯誤是由 theport 監視器報告,且記錄在列印工作的狀態資訊。多工緩衝處理器,接下來會傳播合理的錯誤資訊,到印表機佇列。

因此,印表機的系統報告沒有狀態,當印表機佇列 isempty。在此狀態下,印表機會假設已準備好接收列印工作。這是有效的假設,即使實體印表機處於冬眠例如離線。即使基於某些原因,它無法完成傳遞到實體印表機,作業系統將認定印表機準備 toaccept 的列印工作。這種情況下會被視為錯誤狀態必須處理使用者的作業系統中。它是 notconsidered 來做為應用程式可報告錯誤允許 tocomplete 的多工緩衝處理列印工作的成功。

決定實體印表機的狀態

沒有一個必須是 true,即可判斷 stateof 實體印表機的基本前提: 多工緩衝處理器必須嘗試傳送列印 jobto 實體印表機。這是唯一的連接埠的印表機 isreported 狀態監視的時候。此外,最有意義的 informationmay 會在報告該特定的列印工作的JOB_INFO結構狀態成員,因為某些連接埠監視器會有這些值直接設定。

JOB_INFO結構包含狀態成員與pStatus成員。這兩個成員包含連接埠監視器所報告的列印工作的狀態資訊。這兩個成員的不同,在狀態成員是狀態的位元欄位包含預先決定的值, pStatus成員時可以包含任何字串的指標。這些值會記錄由 Win32 SDK 和 WinSpool.h 標頭檔。PStatus成員有時候,但並不一定設定為描述性的狀態字串。這個字串的內容會定義每個連接埠監視器。

JOB_INFO結構由兩個 API 函式傳回: GetJob 和 EnumJobs。EnumJobs 會傳回JOB_INFO結構的陣列而不需要的呼叫端參考特定的工作在印表機佇列中。列印目前 despooling (列印) 的工作包含狀態資訊。若要在陣列中尋找這項作業,請搜尋JOB_INFO結構,以找出列印工作的狀態成員都有 JOB_STATUS_PRINTING 位元組的陣列。

決定印表機狀態的更容易的方法是檢查PRINTER_INFO結構的 Statusmember。這個結構是由GetPrinter函式傳回。還有一項缺點,這種方法,因為可能會提供更多詳細資料,或是大量的狀態資訊的PRINTER_INFO結構中沒有pStatus字串成員。不過,沒有一項優點,因為連接埠監視器可能設定一些更廣泛的印表機狀態位元的PRINTER_INFO結構。不過請注意預設的連接埠監視器,windows 不會通常設定一個以上的印表機的狀態成員的PRINTER_STATUS_ERROR位元。

請注意不論是哪一組結構狀態成員可能會包含與實體印表機不嚴格相關的 stateinformation。Forexample, PRINTER_INFO結構的狀態成員可能與PRINTER_STATUS_PAUSEDPRINTER_STATUS_PENDING_DELETION,列印佇列嚴格相關的設定。此外, JOB_INFO結構的狀態成員可能包含JOB_STATUS_PAUSEDJOB_STATUS_DELETING,只用於該特定的列印工作相關的狀態值。此外,要注意的是,它們有 despooled,並會保留與JOB_STATUS_PRINTED狀態之後,可能會在列印佇列中累積的列印工作。

這些函式需要的印表機],以找出 thedesired 印表機的控制代碼。這個控制代碼被取自OpenPrinter函式,可接受字串,包含印表機的名稱。這個名稱可以是任一本機印表機的名稱或 UNC 共用到網路印表機的名稱。

下列程式碼範例示範如何呼叫EnumJobs函式正確擷取JOB_INFO結構,以及如何呼叫GetPrinter函式,以取得PRINTER_INFO結構:

範例程式碼

   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;   }				
附註: 在 Windows NT 上啟用印表機集區時,可能有多個列印工作 despooling 從印表機佇列,將會報告狀態。這個範例程式碼不會考慮這個情況。
参考
如需有關的一般指示在呼叫 Win32 多工緩衝處理器的函式的詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
158828 呼叫 Wind32 多工緩衝處理器列舉 Api 如何運作
GdiSpool

警告:本文為自動翻譯

內容

文章識別碼:160129 - 最後檢閱時間:05/23/2015 19:27:00 - 修訂: 5.0

Microsoft Win32 Application Programming Interface

  • kbFAQ kbhowto kbmt KB160129 KbMtzh
意見反應
="https://c.microsoft.com/ms.js">