我正在尝试使用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...");
}
}
答案 0 :(得分:2)
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()方法仅在命令完成后返回(在我的例子中,“打印文档”)。 [不确定这是否准确,但至少这是我的经验]
那么我们的选择是什么?
我选择了选项2,因为我正在处理其他文档类型,如PDF,PPT,而我懒得改变实现! :)