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会弹出“坏文档!修复”对话框。我希望该服务能够识别出该单词的播放效果不佳并终止该进程并继续处理其队列中的下一个文档。

我该怎么办?

[更新]

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

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 文档,这些开关以安静模式 (/q) 启动 Word,并响应一个 DDE 请求(您可以尝试省略 /x)

于 2010-07-08T20:01:19.857 回答
0

好的,Guyz,这就是我发现的!

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

那么我们有哪些选择呢?

  1. 正如@Hans 提到的,使用 COM 互操作。
  2. 在单独的线程中运行打印作业,并等待线程完成预定义的时间间隔,并在此时间间隔后终止相应的字处理。

我选择了选项 2,因为我正在处理 PDF、PPT 等其他文档类型,我懒得更改实现!:)

于 2010-07-19T20:20:20.197 回答