4

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

以下命令正在从 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:当我在没有应用隐藏窗口样式和 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();

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

4

1 回答 1

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 = "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 Explorer 是一个 64 位程序(在 64 位 Windows 中运行时),而 Sysnative 文件夹只能从 32 位软件中看到和访问。如果 64 位软件需要访问 Windows 中的 64 位系统文件夹,唯一的选择是使用 System32 文件夹名称(例如:C:\Windows\System32)。

使用“Sysnative”文件夹将帮助您从 32 位代码访问 64 位工具 64 位 Windows 中的某些工具仅存在于 64 位版本中;没有可用的 32 位版本。其中一些工具位于 64 位 System32 文件夹中。一个示例是用于帮助解决 NetBIOS 名称解析问题的 nbtstat 工具。如果您尝试从 32 位代码(例如从应用程序或脚本)运行 nbtstat 工具并使用 C:\Windows\System32 之类的路径,您将收到“找不到文件”错误。找不到文件;尽管 Windows 资源管理器显示 nbtstat 程序文件实际上位于 C:\Windows\System32 文件夹中。
这个(有点令人困惑)问题的解决方案是在您想要运行该工具时在文件夹路径中包含虚拟 Sysnative 文件夹。例如像这样: C:\Windows\Sysnative\nbtstat.exe 上面的文件路径将使您能够从 32 位应用程序或 32 位脚本访问 64 位 nbtstat 工具。我们建议您阅读这篇文章/博客文章(在 Scottie 的 Tech.Info 上)以获取有关此内容的更多详细信息。

于 2015-09-15T19:07:21.810 回答