1

我正在创建一个应该使用 lpr.exe 并向其传递参数的 C# 应用程序。我目前正在尝试这样做:

DirectoryInfo filePathDirectory = new DirectoryInfo(filePath);              
Process a = new Process();
a.StartInfo.FileName = @"C:\Windows\System32\lpr.exe";
a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " + "\"" + filePathDirectory + "\"";
a.StartInfo.UseShellExecute = false;
a.Start();
a.WaitForExit();

但是每当我到达时,a.Start();我都会得到一个未处理的 Win32 异常,它指出“系统找不到指定的文件”。这真的让我很困惑,因为起初我以为这是我的论点,但事实证明,我可以从 VB 应用程序传递完全相同的论点并让它工作。

更新1:

有效的VB代码是:

Dim RPname As String
RPname = FileName.ToString
Dim a As New Process
a.StartInfo.FileName = "C:\Windows\system32\lpr.exe"
a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " & Chr(34) & RPname & Chr(34)
a.StartInfo.UseShellExecute = False
a.Start()
a.WaitForExit()

更重要的是,我的问题似乎与参数声明无关,因为我可以将其注释掉,但我仍然收到错误。

更新 2:

我在进程开始时得到的错误是:系统找不到指定的文件。如果我将文件名更改为“C:\Windows\System32\cmd.exe”,我不会收到错误消息,它工作正常...

4

2 回答 2

2

您在 c# 代码中使用DirectoryInfo对象并将其连接起来。尝试将您的代码更改为:

try
{
  DirectoryInfo filePathDirectory = new DirectoryInfo(filePath);              
  Process a = new Process();
  a.StartInfo.FileName = @"C:\Windows\syswow64\lpr.exe";  // ADAPTED to the new path!! worked!
  // use filePathDirectory.FullName!!
  a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " + "\"" + filePathDirectory.FullName + "\"";
  // or change it to - found it more readable imo
  a.StartInfo.Arguments = string.Format(
                               "-SServerName.Domain.net -Plp \"{0}\"", 
                               filePathDirectory.FullName);
  a.StartInfo.UseShellExecute = false;
  a.Start();
  a.WaitForExit();
} 
catch (Exception ex)
{
  Debug.WriteLine(ex.Message);
}

编辑

找到解决您问题的方法!根据他给出的答案,第一学分归@Sundeep 。他将我指向一个网站,表明

是的,我有,但是在32位应用程序。

此外

...试图让一个 32 位程序在 Windows 2008 R2 中启动 lpr.exe。它失败是因为 lpr.exe 在操作系统的 32 位视图中不存在。...

作为解决方法,我将 lpr*.* 从 32 位 O/S system32 文件夹复制到2008 R2 机器上的 SYSWOW64 中...

于 2012-09-24T20:05:28.117 回答
0

将您的代码更改为:

DirectoryInfo filePathDirectory = new DirectoryInfo(filePath);              
Process a = new Process();
a.StartInfo.FileName = @"C:\Windows\Sysnative\lpr.exe";
a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " + "\"" + filePathDirectory + "\"";
a.StartInfo.UseShellExecute = false;
a.Start();
a.WaitForExit();

Pilgerstorfer Franz 的解释是完全正确的,但尤其是在像我这样的环境中,在每台机器上移动和移动 lpr.exe 的位置需要做很多工作。简单的解决方案是使用 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”文件夹将帮助您从 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:03:28.220 回答