使用 Win32 API 将原始数据发送到打印机

原文地址::https://docs.microsoft.com/zh-cn/troubleshoot/windows/win32/win32-raw-data-to-printer

相关文章

1、USB口的打印机接计算机,CreateFile函数的第一个参数该如何写----https://bbs.csdn.net/topics/370169850

2、USB 用CreateFile()打开usb设备时,如何填写devicepath这个值?----https://bbs.csdn.net/topics/392451132

3、USB接口打印机直接打印(无需驱动)----https://download.csdn.net/download/qq_34431829/10954749

 

文介绍如何使用 Win32 API 将原始数据发送到打印机。

原始产品版本:  Windows API
原始 KB 数:  138594

摘要

有时,不需要将打印机特定的数据直接发送到打印机,而是绕过驱动程序。 Win32 API 提供了它在本地和网络打印机上的工作方式。 此方法可用于替换 PASSTHROUGH SpoolFile() 在早期版本的 Windows API 中使用的转义和方法。

代码示例

您可以使用以下代码将原始数据直接发送到 Windows NT 或 Windows 95 中的打印机。

C++复制

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

以下文件可从 Microsoft 下载中心下载:

RAWPRN.EXE

有关如何下载 Microsoft 支持文件的详细信息,请参阅如何从联机服务获取 Microsoft 支持文件

Microsoft 已对此文件进行病毒扫描。 Microsoft 使用了最新的病毒检测软件,该软件在文件发布之日起可用。 文件存储在安全增强的服务器上,可帮助防止对文件进行任何未经授权的更改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用pdfium库将pdf文件发送打印机打印的方法如下: 1. 安装pdfium库,并使用C++代码读取pdf文件。 2. 将pdf文件转换为打印作业,可以使用Windows API中的Print Spooler API或者CUPS API。 3. 使用Print Spooler API或者CUPS API发送打印作业到打印机打印。 下面是一个简单的例子,演示如何使用pdfium库将pdf文件发送打印机打印: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "fpdfview.h" #include "fpdf_doc.h" #include "fpdf_save.h" #ifdef _WIN32 #include <windows.h> #endif int main(int argc, char* argv[]) { // 读取pdf文件 FPDF_DOCUMENT doc = FPDF_LoadDocument("test.pdf", NULL); if (!doc) { printf("Error: cannot load PDF file.\n"); return 1; } // 转换为打印作业 FPDF_PRINT_SETTINGS print_settings; memset(&print_settings, 0, sizeof(print_settings)); print_settings.header = NULL; print_settings.footer = NULL; print_settings.bFitToPage = TRUE; print_settings.bPrintAsImage = FALSE; FPDF_DOCUMENT_OUTPUT_SETTINGS output_settings = {0, 0, 0, 0, NULL, &print_settings}; int num_pages = FPDF_GetPageCount(doc); for (int i = 0; i < num_pages; i++) { FPDF_PAGE page = FPDF_LoadPage(doc, i); if (!page) { printf("Error: cannot load page %d.\n", i); continue; } FPDF_PrintPage(page, &output_settings); FPDF_ClosePage(page); } // 发送打印机打印 #ifdef _WIN32 // Windows平台使用Print Spooler API发送打印作业到打印机 HDC printer_dc = CreateDC(NULL, TEXT("Microsoft Print to PDF"), NULL, NULL); if (!printer_dc) { printf("Error: cannot create printer device context.\n"); return 1; } DOCINFO doc_info; memset(&doc_info, 0, sizeof(doc_info)); doc_info.cbSize = sizeof(doc_info); doc_info.lpszDocName = TEXT("test.pdf"); if (StartDoc(printer_dc, &doc_info) == SP_ERROR) { printf("Error: cannot start print job.\n"); DeleteDC(printer_dc); return 1; } if (StartPage(printer_dc) <= 0) { printf("Error: cannot start print page.\n"); EndDoc(printer_dc); DeleteDC(printer_dc); return 1; } FPDF_DOCUMENT pdf_doc = FPDF_LoadDocument("test.pdf", NULL); if (!pdf_doc) { printf("Error: cannot load PDF file.\n"); EndPage(printer_dc); EndDoc(printer_dc); DeleteDC(printer_dc); return 1; } num_pages = FPDF_GetPageCount(pdf_doc); for (int i = 0; i < num_pages; i++) { FPDF_PAGE page = FPDF_LoadPage(pdf_doc, i); if (!page) { printf("Error: cannot load page %d.\n", i); continue; } FPDF_RenderPage(printer_dc, page, 0, 0, 0, 0, FPDF_ROTATE_0, FPDF_PRINTING); FPDF_ClosePage(page); } FPDF_CloseDocument(pdf_doc); if (EndPage(printer_dc) <= 0) { printf("Error: cannot end print page.\n"); EndDoc(printer_dc); DeleteDC(printer_dc); return 1; } if (EndDoc(printer_dc) == SP_ERROR) { printf("Error: cannot end print job.\n"); DeleteDC(printer_dc); return 1; } DeleteDC(printer_dc); #else // Linux和macOS平台使用CUPS API发送打印作业到打印机 // TODO: 实现使用CUPS API发送打印作业到打印机的代码 #endif // 释放资源 FPDF_CloseDocument(doc); return 0; } ``` 注意:具体的打印操作需要根据操作系统和打印机类型来确定。在Windows中,可以使用Print Spooler API发送打印作业到打印机;在Linux和macOS中,可以使用CUPS API发送打印作业到打印机

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值