2015-04-01 217 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;