【发布时间】:2008-08-13 14:42:52
【问题描述】:
在使用 Office 自动化时,有没有办法检查 Microsoft Office 进程(即 Word、Excel)是否挂起?另外,如果进程挂起,有没有办法终止它?
【问题讨论】:
标签: language-agnostic ms-office office-automation
在使用 Office 自动化时,有没有办法检查 Microsoft Office 进程(即 Word、Excel)是否挂起?另外,如果进程挂起,有没有办法终止它?
【问题讨论】:
标签: language-agnostic ms-office office-automation
首先让我说我不建议在服务器上的服务中这样做,但我会尽力回答问题。
作为服务运行使清理变得困难。例如,您作为服务运行的内容可以杀死一个悬而未决的单词或 excel。您可能不得不终止服务。如果 word 或 excel 处于这种状态,您的服务会停止吗?
尝试测试它是否挂起的一个问题是,您的测试可能会导致一个新的 word 实例启动并工作,而服务正在运行的那个实例仍然会被挂起。
确定它是否挂起的最好方法是让它做它应该做的事情并检查结果。我需要更多地了解它实际上在做什么。
这里有一些用于清理批处理文件的命令(都应该在路径中):
sc query servicename - 查询servicename的状态
taskkill /F /IM excel.exe - 终止所有 excel.exe 实例
【讨论】:
我记得几年前这样做了 - 所以我说的是 Office XP 或 2003 天,而不是 2007 年。
显然,如今更好的自动化解决方案是使用新的 XML 格式,该格式使用 System.IO.Packaging 命名空间描述 docx 等。
那时,我曾经注意到,每当 MSWord 踢桶并受够了,机器上就会运行一个名为“Dr. Watson”的进程。这是我第一个知道 Word 绊倒的线索。有时我可能会看到多个WINWORD.EXE,但我的代码只是用来扫描好医生。一旦我看到(在代码中),我自己杀死了所有 WINWORD.EXE 进程,并重新启动了折磨 Word 的进程:-)
希望能给你一些关于寻找什么的线索。
一切顺利,
罗伯克
附:如果你不正确,我什至可以挖掘出我档案中的代码!
【讨论】:
我可以回答后半部分;如果您的代码中有对应用程序对象的引用,您可以简单地对其调用“退出”:
private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();
为了检查挂起的进程,我猜你想尝试从应用程序中获取一些数据,看看你是否在合理的时间范围内得到结果(检查计时器或其他线程或其他东西)。不过可能有更好的方法。
【讨论】: