从Windows服务打印pcl文件的LPR命令不起作用(现在是一个托盘应用程序)

时间:2012-08-11 13:49:56

标签: c# printing windows-services processstartinfo lpr

我一直在寻找可能的解决方案和解释,但我找不到任何真的。

正在从Windows服务运行以下命令。如果直接在cmd中使用,则相同的命令可以正常工作。 它不会返回任何错误或其他任何内容。

    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "cmd.exe";
    startInfo.Arguments = "/C lpr.exe –S " + printerIP + " –P " + deviceName + " –o l " + fInfo.DirectoryName + @"\" + fInfo.Name;
    process.StartInfo = startInfo;
    process.Start();

这可能只是我遗失的一些小事,但我看不到它。如果可以使用lpr-command和一个简单的替代方案,我会喜欢它,但我还没有看到任何东西。

编辑: 忘了添加我正在尝试发送到打印机的文件是一个pcl文件。

EDIT2: 当我运行命令而没有将Hidden windowstyle和WaitForExit(5000)应用于进程时,我似乎看不到任何命令行写入 - 所有出现的都是空的命令提示符。

编辑3: 现在一直在玩弄这个,我想出了以下内容:

    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "lpr";
    startInfo.Arguments = " –S " + printerIP + " –P " + deviceName + " –o l " + fInfo.DirectoryName + @"\" + fInfo.Name;
    process.StartInfo = startInfo;
    process.Start();

如果用户单击表单中的按钮执行上述代码,则上述代码有效。所以我决定将我的代码更改为托盘应用程序运行,因为我认为这可能会解决问题 - 但它仍然似乎拒绝运行。它是由某个触发计时器还是另一个线程运行的某种问题?或者可能与这些方法的权利有关?

1 个答案:

答案 0 :(得分:2)

将您的代码更改为:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C C:\windows\Sysnative\lpr.exe –S " + printerIP + " –P " + deviceName + " –o l " + fInfo.DirectoryName + @"\" + fInfo.Name;
process.StartInfo = startInfo;
process.Start();

问题是您尝试从32位cmd.exe应用程序访问64位应用程序(lpr)。简单的解决方案是使用sysnative目录。

http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm

  

' Sysnative'文件夹在Windows资源管理器中不可见如果您   启动Windows资源管理器并打开硬盘上的Windows文件夹,   您可能会注意到Sysnative文件夹未显示。主要原因   对此,Windows资源管理器是一个64位程序(在运行时   64位Windows),Sysnative文件夹只能看到   可从32位软件访问。如果64位软件需要访问   Windows中的64位系统文件夹,唯一的选择是使用   System32文件夹名称(例如:C:\ Windows \ System32)。

     

使用' Sysnative'文件夹将帮助您从中访问64位工具   32位代码64位Windows中的某些工具仅存在于64位中   版;没有32位版本可用。还有一些这样的工具   位于64位System32文件夹中。一个例子是nbtstat   用于帮助解决NetBIOS名称解析的工具   问题。如果您尝试从32位代码运行nbtstat工具(for   来自应用程序或脚本的示例)并使用类似的路径   C:\ Windows \ System32,你会得到一个"找不到文件"错误。文件   无法找到;虽然Windows资源管理器显示了nbtstat   程序文件实际上位于C:\ Windows \ System32文件夹中   这个(有点令人困惑)问题的解决方案是包括   要运行的文件夹路径中的虚拟Sysnative文件夹   工具。例如:C:\ Windows \ Sysnative \ nbtstat.exe   上面的文件路径将允许您从a访问64位nbtstat工具   32位应用程序或32位脚本。我们建议您阅读   这篇文章/博客文章(在Scottie的Tech.Info上)获取更多细节   关于这个。