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 エクスプローラーが 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:07:21.810 に答える