1

ShellExecute を使用して Windows サービスから pdf、ppt、および word ドキュメントを印刷しようとしています。

Process printingProcess = new Process
                        {
                            StartInfo =
                                {
                                    FileName = filePath,
                                    WindowStyle = ProcessWindowStyle.Hidden,
                                    CreateNoWindow = true,
                                    UseShellExecute = true,
                                    Verb = "Print"
                                }
                        };
printingProcess.Start();

これはほとんどの場合に機能します。しかし、破損している Word 文書の場合、Process.Start メソッドは完了せず、サービスがハングします。

基本的に、Word は "bad document! repair" ダイアログをポップアップします。私は、単語が適切に再生されていないことをサービスが識別し、プロセスを強制終了して、キュー内の次のドキュメントに進むようにしたいと考えています。

私は何をすべきか?

[アップデート]

皆さん、問題を再現するコードは次のとおりです。

static void Main(string[] args)
{
    string filePath = @"d:\corruptdocument.docx";

    PrintDocument(filePath);

    Console.WriteLine("Completed!");
    Console.ReadKey();
}

private static void PrintDocument(string filePath)
{
    Process printingProcess = new Process
                                {
                                    StartInfo =
                                        {
                                            FileName = filePath,
                                            WindowStyle = ProcessWindowStyle.Hidden,
                                            CreateNoWindow = true,
                                            UseShellExecute = true,
                                            Verb = "Print"
                                        }
                                };
    using (printingProcess)
    {
        Console.WriteLine("Starting process...");
        printingProcess.Start();
        Console.WriteLine("Completed start...");
    }
}

そして、ここにスクリーンショットがあります:http://twitpic.com/23jwor

4

3 に答える 3

2

いや、それは正確ではありません。ShellExecuteEx も CreateProcess もブロックできません。それは確かにあなたのコードの次のステートメントであり、あなたが投稿していないものです。Process.WaitForExit() で推測します。タイムアウトを受け入れるオーバーロードがあることに注意してください。

確実に機能するとは限りません。Word は単一インスタンスのプロセスです。Microsoft.Office.Interop.Word を使用すると、より優れたネズミ捕りになります。Application.Document.Open() メソッドは、OpenAndRepair 引数を受け入れます。

于 2010-07-08T20:08:44.443 に答える
0

/q および /x コマンドライン スイッチを StartInfo に追加してみてください。

MSのドキュメントによると、これらのスイッチは Word をクワイエット モード (/q) で起動し、1 つの DDE 要求に応答します (/x を省略してみてください)。

于 2010-07-08T20:01:19.857 に答える
0

オーケーガイズ、これが私が見つけたものです!

Word の ShellExecute は DDE を使用します。したがって、process.Start() メソッドは、コマンドが完了した後にのみ返されます (私の場合は、「ドキュメントの印刷」)。[これが正確かどうかはわかりませんが、少なくともそれは言葉での私の経験です]

では、私たちの選択肢は何ですか?

  1. @Hansが述べたように、COM相互運用を使用してください。
  2. 別のスレッドで印刷ジョブを実行し、スレッドが定義済みの間隔で完了するのを待ち、この間隔の後に対応するワード プロセスを終了します。

オプション 2 を選択したのは、PDF や PPT などの他のドキュメント タイプを扱っていたため、実装を変更するのが面倒だったからです。:)

于 2010-07-19T20:20:20.197 に答える