Как отправить данные на принтер напрямую
|
Иногда, необходимо в обход драйвера посылать данные на принтер напрямую. Следующий пример показывает, как сделать это как для локального принтера, так и для сетевого. Этот способ может служить заменой последовательности 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; } |