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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM