-->

LPR命令打印从服务无法正常工作窗口PCL-文件(现在的托盘应用程序)(LPR command to

2019-09-21 03:14发布

我一直在寻找了一段时间的可能解决方案和解释,但我真的不能找到任何东西。

下面的命令正在从一个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命令来绕去,我很想去,但我还没有看到任何迹象。

编辑:忘了补充一点,我试图向打印机发送的文件是一个PCL文件。

EDIT2:当我没有隐藏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();

如果通过点击的形式的按钮的用户执行上述代码工作。 所以,我决定改变我的代码插入运行的托盘应用,看到我想这可能解决问题 - 但它似乎仍然拒绝正在运行。 难道是某种问题,它被触发的计时器或其他线程上运行? 或许是与这些方法的权利?

Answer 1:

你的代码改成这样:

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

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

使用“Sysnative”文件夹,将帮助您从32位代码,在64位Windows中的某些工具仅在64位版本中存在访问64位工具; 没有可用的32位版本。 而其中的一些工具都位于64位的System32文件夹中。 一个例子是使用nbtstat工具,用于帮助解决NetBIOS名称解析问题。 如果您尝试(从应用程序或通过脚本为例)从运行32位代码的使用nbtstat工具,并使用像C路径:\ Windows \ System32下,你会得到一个“找不到文件”的错误。 该文件无法找到; 虽然Windows资源管理器显示,使用nbtstat程序文件实际上是位于C:\ windows \ system32目录。
这个(有点混乱)问题的解决方案是要包括在文件夹路径虚拟Sysnative文件夹时要运行该工具。 例如像这样:C:\ WINDOWS \ Sysnative \ nbtstat.exe文件路径上面会给你从32位应用程序或从32位脚本访问到64位的nbtstat工具。 我们建议您阅读这篇文章/博客文章(在迪的Tech.Info),以获得更多这方面的细节。



文章来源: LPR command to print pcl-file from windows service not working(Now a tray application)