zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    17. Letter Combinations of a Phone Number
    16. 3Sum Closest
    15. 3Sum
    14. Longest Common Prefix
    13. Roman to Integer
    12. Integer to Roman
    11. Container With Most Water
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/grebamboo/p/12720447.html
Copyright © 2011-2022 走看看