LPR过程中未处理的C#异常

时间:2012-09-24 19:05:04

标签: c# vb.net process unhandled-exception lpr

我正在创建一个应该使用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:

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

2 个答案:

答案 0 :(得分: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);
}

修改

找到问题的解决方案!第一个 - 根据他的given answer去@Sundeep。他给我一个webSite指示

  

是的我有,但位于c:\ windows \ system32 64位文件不是   通过32位命令提示符(c:\ windows \ syswow64 \ cmd.exe)看到的是   从32位应用程序调用批处理文件时启动。

此外

  

...试图让32位程序启动   Windows 2008 R2中的lpr.exe。 失败,因为lpr.exe没有   存在于O / S的32位视图中。 ...

     

对于解决方法,我从32位O / S system32文件夹中复制了lpr *。*   在2008 R2机器上进入SYSWOW64 ......

答案 1 :(得分: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'文件夹将帮助您从中访问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上)获取更多细节   关于这个。