通过重定向打印机打印标签

时间:2015-04-01 11:32:43

标签: winapi printing windows-server-2008-r2 rdp thermal-printer

我的任务是通过热敏打印机打印标签。为此目的,生成一串tspl(打印机理解的编程语言)命令并将其发送到打印机。后者是在C#中完成的,其中以下方法取自microsoft示例"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台共享热敏打印机组成的LAN:

  1. PC_with_printer - 它在Windows 7上运行并通过USB连接打印机
  2. PC_aware - 它在Win 8上运行并了解共享打印机
  3. PC_unaware - 它在WinXP上运行并且没有安装共享打印机
  4. 从PC_aware我通过rdp连接到PC_unaware,打印机显示在重定向的打印机列表中。然后我运行我的应用程序,选择重定向的打印机并打印我的空标签。到目前为止一切顺利。
    当我用另一台计算机替换PC_unaware时出现问题。它在Windows Server 2008 R2上运行,不在我们的LAN中。我们称之为SERVER。所以我进行了同样的实验:

    1. 从PC_aware我通过rdp使用其公共IP地址
    2. 连接到SERVER
    3. 我的热敏打印机在“打印机和设备”中显示为“TSC_TDP-244(重定向20)”
    4. 我转到打印机的属性并单击“打印测试页”,然后打印
    5. 我运行我的应用程序,打印机不打印任何内容。
    6. 我已经检查了SendBytesToPrinter方法(OpenPrinter,StartDocPrinter,StartPagePrinter,WritePrinter,EndPagePrinter,EndDocPrinter,ClosePrinter)中使用的所有winapi函数的返回值,并且它们都没有指示错误。知道它为什么会发生以及如何修复它?

1 个答案:

答案 0 :(得分:0)

file