Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как отправлять необработанные данные на принтер с помощью API Win32.
Исходная версия продукта: API Windows
Исходный номер базы знаний: 138594
Итоги
Иногда необходимо отправлять данные, относящиеся к принтеру, напрямую на принтер, обходя драйвер. API Win32 предоставляет функцию, работающую с локальными и сетевыми принтерами. Этот метод можно использовать для замены методов PASSTHROUGH escape и SpoolFile(), которые применяются в предыдущих версиях Windows API.
Пример кода
Следующий код можно использовать для отправки необработанных данных непосредственно на принтер в Windows NT или Windows 95.
// RawDataToPrinter - sends binary data directly to a printer
// Params:
// szPrinterName - NULL terminated string specifying printer name
// lpData - Pointer to raw data bytes
// dwCount - Length of lpData in bytes
// Returns: TRUE for success, FALSE for failure.
BOOL RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
{
HANDLE hPrinter;
DOC_INFO_1 DocInfo;
DWORD dwJob;
DWORD dwBytesWritten;
// Need a handle to the printer.
if(!OpenPrinter( szPrinterName, &hPrinter, NULL))
return FALSE;
// Fill in the structure with info about this "document."
DocInfo.pDocName = "My Document";
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = "RAW";
// Inform the spooler the document is beginning.
if((dwJob = StartDocPrinter(hPrinter, 1, (LPSTR)&DocInfo)) == 0)
{
ClosePrinter(hPrinter);
return FALSE;
}
// Start a page.
if(!StartPagePrinter(hPrinter))
{
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}
// Send the data to the printer.
if(!WritePrinter(hPrinter, lpData, dwCount, &dwBytesWritten))
{
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}
// End the page.
if(!EndPagePrinter(hPrinter))
{
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}
// Inform the spooler that the document is ending.
if(!EndDocPrinter(hPrinter))
{
ClosePrinter(hPrinter);
return FALSE;
}
// Tidy up the printer handle.
ClosePrinter(hPrinter);
// Check to see if correct number of bytes were written.
if(dwBytesWritten != dwCount)
return FALSE;
return TRUE;
}
Следующий файл доступен для скачивания из Центра загрузки Майкрософт:
Дополнительные сведения о загрузке файлов поддержки Майкрософт см. в разделе "Как получить файлы поддержки Майкрософт из онлайн-сервисов".
Корпорация Майкрософт отсканировал этот файл для вирусов. Корпорация Майкрософт использовала самое актуальное программное обеспечение обнаружения вирусов, которое было доступно на дате публикации файла. Файл хранится на серверах с повышенными безопасностью, которые помогают предотвратить любые несанкционированные изменения в файле.