Процесс. Запустите с 'UseShellExecute = верный', не возвращается для поврежденных документов слова

Я пытаюсь распечатать PDF, ppt, и документы слова от моего сервисного использования окон ShellExecute.

Process printingProcess = new Process
                        {
                            StartInfo =
                                {
                                    FileName = filePath,
                                    WindowStyle = ProcessWindowStyle.Hidden,
                                    CreateNoWindow = true,
                                    UseShellExecute = true,
                                    Verb = "Print"
                                }
                        };
printingProcess.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

1
задан madaboutcode 8 July 2010 в 20:29
поделиться

3 ответа

Ладно, парень, вот что я узнал!

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

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

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

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

0
ответ дан 2 September 2019 в 23:12
поделиться

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

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

2
ответ дан 2 September 2019 в 23:12
поделиться

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

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

.
0
ответ дан 2 September 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: