如何:将数据直接发送到 GDI 打印机

本主题后面的代码示例演示如何将打印机控制数据直接发送到使用基于 GDI 的打印机驱动程序的打印机。

以下步骤介绍如何将数据直接发送到打印机。 后面的代码示例中也演示了这些步骤。

  1. 调用 OpenPrinter 以获取打印机的句柄。
  2. 使用打印机数据初始化 DOCINFO 结构。
  3. 调用 StartDocPrinter 以指示应用程序将向打印机发送文档数据。
  4. 调用 StartPagePrinter 以指示应用程序将向打印机发送新页面。
  5. 调用 WritePrinter 以发送数据。
  6. 调用 EndPagePrinter 以指示已发送当前页的所有数据。
  7. 调用 EndDocPrinter 以指示已发送此文档的所有数据。
  8. 调用 ClosePrinter 以释放资源。

将打印机控制数据直接发送到使用基于 GDI 的打印机驱动程序的打印机。

// 
// 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(LPTSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
{
    BOOL     bStatus = FALSE;
    HANDLE     hPrinter = NULL;
    DOC_INFO_1 DocInfo;
    DWORD      dwJob = 0L;
    DWORD      dwBytesWritten = 0L;

    // Open a handle to the printer. 
    bStatus = OpenPrinter( szPrinterName, &hPrinter, NULL );
    if (bStatus) {
        // Fill in the structure with info about this "document." 
        DocInfo.pDocName = (LPTSTR)_T("My Document");
        DocInfo.pOutputFile = NULL;
        DocInfo.pDatatype = (LPTSTR)_T("RAW");

        // Inform the spooler the document is beginning. 
        dwJob = StartDocPrinter( hPrinter, 1, (LPBYTE)&DocInfo );
        if (dwJob > 0) {
            // Start a page. 
            bStatus = StartPagePrinter( hPrinter );
            if (bStatus) {
                // Send the data to the printer. 
                bStatus = WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten);
                EndPagePrinter (hPrinter);
            }
            // Inform the spooler that the document is ending. 
            EndDocPrinter( hPrinter );
        }
        // Close the printer handle. 
        ClosePrinter( hPrinter );
    }
    // Check to see if correct number of bytes were written. 
    if (!bStatus || (dwBytesWritten != dwCount)) {
        bStatus = FALSE;
    } else {
        bStatus = TRUE;
    }
    return bStatus;
}

ClosePrinter

EndDocPrinter

EndPagePrinter

OpenPrinter

StartDocPrinter

StartPagePrinter

WritePrinter