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()

さらに、コメントアウトしてもエラーが発生するため、argumentsステートメントに問題がないようです。

アップデート2:

プロセスの開始時に発生するエラーは次のとおりです。システムは指定されたファイルを見つけることができません。FileNameを「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 に送られます。彼は私に次のことを示すウェブサイトを教えてくれました

はい、ありますが、c:\windows\system32 にある64 ビット ファイルは、32 ビット コマンド プロンプト(c:\windows\syswow64\cmd.exe) では表示されません。 -ビットアプリケーション。

そしてさらに

... Windows 2008 R2 内で lpr.exe を起動する 32 ビット プログラムを取得しようとしています。O/S の 32 ビット ビューに lpr.exe が存在しないため、失敗します。...

回避策として、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 フォルダーにあります。1 つの例は、NetBIOS 名前解決の問題のトラブルシューティングに役立つ nbtstat ツールです。32 ビット コード (アプリケーションやスクリプトなど) から nbtstat ツールを実行しようとして、C:\Windows\System32 などのパスを使用すると、「ファイルが見つかりません」というエラーが発生します。ファイルが見つかりません。ただし、Windows エクスプローラーでは、nbtstat プログラム ファイルが実際には C:\Windows\System32 フォルダーにあることが示されます。
この (やや紛らわしい) 問題の解決策は、ツールを実行するときに、仮想 Sysnative フォルダーをフォルダー パスに含めることです。例: C:\Windows\Sysnative\nbtstat.exe 上記のファイル パスにより、32 ビット アプリケーションまたは 32 ビット スクリプトから 64 ビット nbtstat ツールにアクセスできます。詳細については、この記事/ブログ投稿 (Scottie's Tech.Info) をお読みになることをお勧めします。

于 2015-09-15T19:03:28.220 に答える