Я пытаюсь распечатать 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
Ладно, парень, вот что я узнал!
ShellExecute, например, использует DDE. Таким образом, метод process.Start () возвращается только после завершения команды (в моем случае «печать документа»). [Не уверен, что это так, но, по крайней мере, это мой опыт работы со словом]
Итак, каковы наши варианты?
Я выбрал вариант 2, так как имел дело с другими типами документов, такими как PDF, PPT, и мне было лень менять реализацию! :)
Нет, это не может быть точно. Ни ShellExecuteEx, ни CreateProcess не могут блокировать. Это, безусловно, следующая инструкция в вашем коде, которую вы не публиковали. Я бы предположил, что Process.WaitForExit (). Обратите внимание, что у него есть перегрузка, допускающая тайм-аут.
Не то, чтобы он работал надежно, Word - это однократный процесс. Лучше использовать Microsoft.Office.Interop.Word. Метод Application.Document.Open () принимает аргумент OpenAndRepair.
попробуйте добавить ключи командной строки /q и /x в StartInfo.
Согласно документации MS, эти переключатели запускают Word в тихом режиме (/q) и отвечают на один запрос DDE (вы можете попробовать опустить /x)
.