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