2015-04-01 157 views
0

我的任務是通過熱敏打印機打印標籤。爲此,生成一串tspl(打印機可識別的編程語言)命令並將其發送到打印機。後者在C#實現從微軟例子"How to send raw data to a printer by using Visual C# .NET"通過重定向打印機打印標籤

 public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount) 
    { 
     Int32 dwError = 0, dwWritten = 0; 
     IntPtr hPrinter = new IntPtr(0); 
     DOCINFOA di = new DOCINFOA(); 
     bool bSuccess = false; // Assume failure unless you specifically succeed. 

     di.pDocName = "My C#.NET RAW Document"; 
     di.pDataType = "RAW"; 

     // Open the printer. 
     if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 
     { 
      // Start a document. 
      if (StartDocPrinter(hPrinter, 1, di)) 
      { 
       // Start a page. 
       if (StartPagePrinter(hPrinter)) 
       { 
        // Write your bytes. 
        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); 
        EndPagePrinter(hPrinter); 
       } 
       EndDocPrinter(hPrinter); 
      } 
      ClosePrinter(hPrinter); 
     } 
     // If you did not succeed, GetLastError may give more information 
     // about why not. 
     if (bSuccess == false) 
     { 
      dwError = Marshal.GetLastWin32Error(); 
      MessageBox.Show("Error " + dwError); 
     } 
     return bSuccess; 
    } 

採取以下方法實際打印機的PrintDialog類

 private void button2_Click(object sender, EventArgs e) 
    { 
     string s = "CLS\nPRINT 1\n"; // device-dependent string, need a FormFeed? 
     // Allow the user to select a printer. 
     PrintDialog pd = new PrintDialog(); 
     pd.PrinterSettings = new PrinterSettings(); 
     if (DialogResult.OK == pd.ShowDialog(this)) 
     { 
      // Send a printer-specific to the printer. 
      RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s); 
     } 
    } 

選擇在我的工作環境,一切工作正常。環境是一個局域網,包括3臺計算機和1臺共享熱敏打印機:

  1. PC_with_printer - 它運行在Windows 7和具有經由USB
  2. 連接到它的打印機PC_aware - 它運行在Win 8上,並且知道共享打印機
  3. PC_unaware - 它運行在WinXP上,並且沒有共享打印呃安裝

從PC_aware我通過rdp連接到PC_unaware和打印機出現在打印機列表中作爲重定向。然後我運行我的應用程序,選擇重定向的打印機並打印我的空標籤。到現在爲止還挺好。
我將PC_unaware替換爲另一臺計算機時出現問題。它運行在Windows Server 2008 R2上,不在我們的LAN中。我們稱之爲服務器。於是我進行了同樣的實驗:

  1. 從PC_aware我使用它的公共IP地址通過RDP連接到服務器
  2. 我的熱敏打印機出現在「打印機和設備」作爲「TSC_TDP-244(重定向20)」
  3. 我去打印機的屬性,然後單擊打印測試頁,它會打印
  4. 我運行我的應用程序和打印機不打印任何東西。

我已檢查,其將在SendBytesToPrinter方法中使用的所有WINAPI函數的返回值(OpenPrinter,StartDocPrinter,StartPagePrinter,WritePrinter,EndPagePrinter,EndDocPrinter,ClosePrinter),其中沒有指示錯誤。任何想法爲什麼會發生,以及如何解決它?

+0

這實際上更像是一個遠程桌面問題。由於PC_unaware沒有局域網連接,並且共享打印機尚未安裝,所以它依賴於RD的打印機克隆功能,我一直髮現這種功能是有問題的。 RD對你想解決的問題真的很重要嗎?如果沒有,我會把它從圖片中刪除。 – 2015-04-01 14:22:45

+0

此打印功能應該在服務器上提供,用戶通過rdp連接到它,所以我擔心RD是必不可少的部分。 – zurab 2015-04-01 14:51:39

+0

我不知道RD如何實現打印機克隆,但是我強烈懷疑它依賴於捲入程序,這意味着直接寫入克隆打印機將無法工作。 RD中需要很多複雜的代碼才能支持直接打印,而且我很少會猜測他們沒有實現它。 – 2015-04-01 15:10:27

回答

0
PRINTER_DEFAULTS pd; 

    pd.DesiredAccess = PRINTER_ACCESS_USE; 
    pd.pDatatype = NULL; 
    pd.pDevMode = NULL; 

    if (!OpenPrinter(szPrinterName, &hPrinter, &pd)) 
     return false;