15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как отправить данные на принтер напрямую.

Иногда, необходимо в обход драйвера посылать данные на принтер напрямую. Следующий пример показывает, как сделать это как для локального принтера, так и для сетевого. Этот способ может служить заменой последовательности PASSTHROUGH, а так же метода SpoolFile.

 // Функция RawDataToPrinter - посылает бинарные данные прямо на принтер
 // 
 // szPrinterName: строка с именем принтера (завершается нулём)
 // lpData:        Указатель на raw-данные
 // dwCount        Длина lpData в байтах
 // 
 // Возвращает: TRUE в случае удачи, FALSE в случае ошибки.
 // 
BOOL RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
   {
     HANDLE     hPrinter;
     DOC_INFO_1 DocInfo;
     DWORD      dwJob;
     DWORD      dwBytesWritten;

     // Необходим дескриптор принтера.
     if( ! OpenPrinter( szPrinterName, &hPrinter, NULL ) )
       return FALSE;

     // Заполняем структуру данными о документе
     DocInfo.pDocName = "My Document";
     DocInfo.pOutputFile = NULL;
     DocInfo.pDatatype = "RAW";
     // Информируем спулер о том, что печать документа начата.
     if( (dwJob = StartDocPrinter( hPrinter, 1, (LPSTR)&DocInfo )) == 0)
     {
       ClosePrinter( hPrinter );
       return FALSE;
     }
     // Начало страницы.
     if( ! StartPagePrinter( hPrinter ) )
     {
       EndDocPrinter( hPrinter );
       ClosePrinter( hPrinter );
       return FALSE;
     }
     // Посылаем данные на принтер.
     if( !WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) )
     {
       EndPagePrinter( hPrinter );
       EndDocPrinter( hPrinter );
       ClosePrinter( hPrinter );
       return FALSE;
     }
     // Конец страницы.
     if( ! EndPagePrinter( hPrinter ) )
     {
       EndDocPrinter( hPrinter );
       ClosePrinter( hPrinter );
       return FALSE;
     }
     // Информируем спулер о конце документа.
     if( ! EndDocPrinter( hPrinter ) )
      {
        ClosePrinter( hPrinter );
        return FALSE;
      }
      // Закрываем дескриптор принтера.
      ClosePrinter( hPrinter );
      // Проверяем правильность количества записанных байт.
      if( dwBytesWritten != dwCount )
        return FALSE;
      return TRUE;
    }