raw.c
上传用户:yuandong
上传日期:2022-08-08
资源大小:954k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. /*++
  2. Copyright (c) 1990-1998  Microsoft Corporation
  3. All Rights Reserved
  4. Abstract:
  5.     Routines to facilitate printing of raw jobs.
  6. --*/
  7. #include <windows.h>
  8. #include <winspool.h>
  9. #include <wchar.h>
  10. #include "winprint.h"
  11. BYTE abyFF[1] = { 0xc };
  12. /*++
  13. *******************************************************************
  14.     P r i n t R a w J o b
  15.     Routine Description:
  16.         Prints out a job with RAW data type.
  17.     Arguments:
  18.         pData           => Print Processor data structure
  19.         pPrinterName    => name of printer to print on
  20.     Return Value:
  21.         TRUE  if successful
  22.         FALSE if failed - GetLastError will return reason
  23. *******************************************************************
  24. --*/
  25. BOOL
  26. PrintRawJob(
  27.     IN PPRINTPROCESSORDATA pData,
  28.     IN LPWSTR pPrinterName,
  29.     IN UINT uDataType)
  30. {
  31.     DOC_INFO_1  DocInfo;
  32.     DWORD       Copies;
  33.     DWORD       NoRead, NoWritten;
  34.     DWORD       i;
  35.     BOOL        rc;
  36.     HANDLE      hPrinter;
  37.     BYTE        pReadBuffer[READ_BUFFER_SIZE];
  38.     DocInfo.pDocName    = pData->pDocument;     /* Document name */
  39.     DocInfo.pOutputFile = pData->pOutputFile;   /* Output file */
  40.     DocInfo.pDatatype   = pData->pDatatype;     /* Document data type */
  41.     /** Let the printer know we are starting a new document **/
  42.     if (!StartDocPrinter(pData->hPrinter, 1, (LPBYTE)&DocInfo)) {
  43.         return FALSE;
  44.     }
  45.     /** Print the data pData->Copies times **/
  46.     Copies = pData->Copies;
  47.     while (Copies--) {
  48.         /**
  49.             Open the printer.  If it fails, return.  This also sets up the
  50.             pointer for the ReadPrinter calls.
  51.         **/
  52.         if (!OpenPrinter(pPrinterName, &hPrinter, NULL)) {
  53.             EndDocPrinter(pData->hPrinter);
  54.             return FALSE;
  55.         }
  56.         /**
  57.             Loop, getting data and sending it to the printer.  This also
  58.             takes care of pausing and cancelling print jobs by checking
  59.             the processor's status flags while printing.
  60.         **/
  61.         while ((rc = ReadPrinter(hPrinter, pReadBuffer, READ_BUFFER_SIZE, &NoRead)) &&
  62.                NoRead) {
  63.             /** If the print processor is paused, wait for it to be resumed **/
  64.             if (pData->fsStatus & PRINTPROCESSOR_PAUSED) {
  65.                 WaitForSingleObject(pData->semPaused, INFINITE);
  66.             }
  67.             /** If the job has been aborted, don't write anymore **/
  68.             if (pData->fsStatus & PRINTPROCESSOR_ABORTED) {
  69.                 break;
  70.             }
  71.             /** Write the data to the printer **/
  72.             WritePrinter(pData->hPrinter, pReadBuffer, NoRead, &NoWritten);
  73.         }
  74.         /**
  75.             Close the printer - we open/close the printer for each
  76.             copy so the data pointer will rewind.
  77.         **/
  78.         ClosePrinter(hPrinter);
  79.     } /* While copies to print */
  80.     /** Let the printer know that we are done printing **/
  81.     EndDocPrinter(pData->hPrinter);
  82.     return TRUE;
  83. }