您的位置:首页 > 其它

Sending Data Directly to a Printer

2011-11-10 18:20 796 查看
It is sometimes necessary to bypass the driver and send printer-specific data directly to a printer.

The following code shows how this can be done for both local and networked printers.

This method can be used to replace the PASSTHROUGH escape and SpoolFile methods.

// RawDataToPrinter - sends binary data directly to a printer

//

// 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: