Process.Start с 'UseShellExecute = true' не возвращается для поврежденных документов Word - PullRequest
1 голос
/ 08 июля 2010

Я пытаюсь распечатать документы pdf, ppt и word из моей службы Windows, используя ShellExecute.

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

Это работает в большинстве случаев. Но для документов Word, которые повреждены, метод Process.Start никогда не завершается, и служба зависает.

В основном, слово всплывает в диалоге "плохой документ! Ремонт". Я хочу, чтобы служба определила, что это слово не играет хорошо, и убила процесс, и приступила к следующему документу в своей очереди.

Что мне делать?

[ОБНОВЛЕНИЕ]

Ребята, вот код для воспроизведения проблемы:

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 ]

2 голосов
/ 09 июля 2010

Нет, это не может быть точным.Ни ShellExecuteEx, ни CreateProcess не могут блокировать.Это, безусловно, следующий оператор в вашем коде, который вы не опубликовали.Я думаю, в Process.WaitForExit ().Обратите внимание, что у него есть перегрузка, которая принимает тайм-аут.

Не то, чтобы он работал надежно, Word - это процесс одного экземпляра.Использование Microsoft.Office.Interop.Word - лучшая мышеловка.Метод Application.Document.Open () принимает аргумент OpenAndRepair.

0 голосов
/ 20 июля 2010

Хорошо, Гайз, вот что я узнал!

ShellExecute для слова использует DDE.Таким образом, метод process.Start () возвращается только после завершения команды (в моем случае «печать документа»).[Не уверен, что это точно, но, по крайней мере, это мой опыт со словом]

Так, каковы наши варианты?

  1. Как уже упоминалось @Hans, используйте COM-взаимодействие.
  2. Запустите задание печати в отдельном потоке и дождитесь завершения потока в течение заданного интервала и завершите соответствующий процесс слова послеэтот интервал.

Я выбрал вариант 2, поскольку имел дело с другими типами документов, такими как PDF, PPT, и мне было лень менять реализацию!:)

0 голосов
/ 09 июля 2010

попробуйте добавить параметры командной строки / q и / x в StartInfo.

С помощью документации MS эти переключатели запускают Word в тихом режиме (/ q) и отвечают на один запрос DDE (вы можете попытаться опустить / x)

...