使用'UseShellExecute = true'的Process.Start不会返回损坏的word文档

时间:2010-07-08 19:56:09

标签: .net ms-word shellexecute

我正在尝试使用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”对话框。我希望服务能够确定该单词不能正常运行并终止该进程并继续其队列中的下一个文档。

我该怎么办?

[UPDATE]

伙计们,这是重现问题的代码:

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

3 个答案:

答案 0 :(得分:2)

不,那不可能是准确的。 ShellExecuteEx和CreateProcess都不能阻止。它肯定是您的代码中的下一个声明,即您没有发布的声明。我猜是在Process.WaitForExit()。请注意,它有一个接受超时的重载。

Word不是一个可靠的工作,而是一个单实例的过程。使用Microsoft.Office.Interop.Word是更好的捕鼠器。 Application.Document.Open()方法接受OpenAndRepair参数。

答案 1 :(得分:0)

尝试将/ q和/ x命令行开关添加到StartInfo。

通过MS documentation,这些开关以安静模式(/ q)启动Word,并响应一个DDE请求(您可以尝试省略/ x)

答案 2 :(得分:0)

好的Guyz,这是我发现的!

ShellExecute for word使用DDE。因此process.Start()方法仅在命令完成后返回(在我的例子中,“打印文档”)。 [不确定这是否准确,但至少这是我的经验]

那么我们的选择是什么?

  1. 正如@Hans所提到的,使用COM互操作。
  2. 在单独的线程中运行打印作业,并等待线程在预定义的时间间隔内完成,并在此间隔后终止相应的字处理。
  3. 我选择了选项2,因为我正在处理其他文档类型,如PDF,PPT,而我懒得改变实现! :)