• Qt程序使用Win32 API发送ZPL指令与斑马打印机通信


      QT使用Win32 API与斑马打印机通信需要库libwinspool.a,这个库一般在Qt安装后就有了,需要去Qt的安装目录去找。复制一份放在自己的工程目录下,然后在Qt的项目右击出现菜单,点击【添加库】导入这个库就行了。

      我安装的Qt,存在libwinspool.a的路径是Qt/Qt5.8.0/Tools/mingw530_32/i686-w64-mingw32/lib/libwinspool.a。

      获取libwinspool.a

      链接:https://pan.baidu.com/s/1-2j0-CqnMn4sKYTp-Fitcw
      提取码:r2ny

      库导入完毕后,请看以下2篇官方文档,我根据官方文档做了下修改,完成了PC程序与斑马打印机的通信。

      (1)https://support.microsoft.com/zh-cn/help/138594/howto-send-raw-data-to-a-printer-by-using-the-win32-api

           (2)https://docs.microsoft.com/en-us/windows/win32/printdocs/sending-data-directly-to-a-printer

      代码如下

      

     1 /**
     2  * @brief Print::RawDataToPrinter
     3  * 发送ZPL指令直接与打印机通信
     4  * @param szPrinterName 打印机名称
     5  * @param lpData  ZPL指令
     6  * @param dwCount 
     7  * @return ZPL指令发送成功,返回true,ZPL指令发送失败,返回false
     8  */
     9 bool RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
    10 {
    11     bool        bStatus = FALSE;      
    12     HANDLE      hPrinter = NULL;      
    13     DOC_INFO_1A DocInfo;           
    14     DWORD       dwJob = 0L;        
    15     DWORD       dwBytesWritten = 0L;
    16 
    17     // 打开打印机的手柄,这里使用OpenPrinterA()而不是OpenPrinter()是因为当前Qt编码是ANSI
    18     bStatus = OpenPrinterA(szPrinterName, &hPrinter, NULL);
    19     if (bStatus)
    20     {
    21         // 填写打印文档信息
    22         DocInfo.pDocName = (LPSTR)"Raw Document";
    23         DocInfo.pOutputFile = NULL;
    24         DocInfo.pDatatype = (LPSTR)"RAW";
    25 
    26 
    27         // 通知后台处理程序文档正在开始
    28         dwJob = StartDocPrinterA(hPrinter, 1, (LPBYTE)&DocInfo);
    29         if (dwJob > 0)
    30         {
    31             // 开始一页的打印
    32             bStatus = StartPagePrinter(hPrinter);
    33             if (bStatus)
    34             {
    35                 // 发送数据到打印机
    36                 bStatus = WritePrinter(hPrinter, lpData, dwCount, &dwBytesWritten);
    37                 EndPagePrinter (hPrinter);
    38             }
    39             // 通知后台处理程序文档正在结束
    40             EndDocPrinter(hPrinter);
    41         }
    42         // 关闭打印机手柄
    43         ClosePrinter(hPrinter);
    44     }
    45     // 检查是否写入了正确的字节数
    46     if (!bStatus || (dwBytesWritten != dwCount))
    47     {
    48         bStatus = false;
    49     }
    50     else
    51     {
    52         bStatus = true;
    53     }
    54     return bStatus;
    55 }
    1 bool Print()
    2 {
    3     QString cmd = tr("^XA^FO50,50^ADN,30,20^FD chen^FS^XZ");
    4     int length = cmd.length();
    5     QString printerName = QPrinterInfo::defaultPrinterName();
    6     bool ret = RawDataToPrinter((LPSTR)printerName.toLocal8Bit().data(),
    7                             (LPBYTE)cmd.toLocal8Bit().data(), (DWORD)length);
    8     return ret;
    9 }
  • 相关阅读:
    requestAnimationFrame
    react 面试题
    useState使用和原理
    常用网址记录
    .net 学习官网
    centos nginx 设置开启启动
    Asp.Net Core 发布和部署 Linux + Nginx
    SQL Server 执行计划缓存
    SQL Server之索引解析(二)
    SQL Server之索引解析(一)
  • 原文地址:https://www.cnblogs.com/grebamboo/p/12720447.html
Copyright © 2020-2023  润新知