我正在编写一个自动化测试来确定MS Word是否成功打开了rtf文件。到目前为止,我遍历给定目录中的所有rtf并打开它们。稍后我将捕获异常以生成报告(记录崩溃单词的文件名)。
我正在处理大量文件。我的应用程序当前正在为每个文件打开一个新的Word实例。谁能告诉我如何关闭Word?
public class LoadRTFDoc
{
private object FileName;
private object ReadOnly;
private object isVisible;
private object Missing;
private ApplicationClass WordApp;
private object Save;
private object OrigFormat;
private object RouteDoc;
public LoadRTFDoc(object filename)
{
this.WordApp = new ApplicationClass();
this.FileName = filename;
ReadOnly = false;
isVisible = true;
Missing = System.Reflection.Missing.Value;
Save = System.Reflection.Missing.Value;
OrigFormat = System.Reflection.Missing.Value;
RouteDoc = System.Reflection.Missing.Value;
}
public void OpenDocument()
{
WordApp.Visible = true;
WordApp.Documents.Open(ref FileName, ref Missing, ref ReadOnly, ref Missing, ref Missing,
ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing,
ref isVisible, ref Missing, ref Missing, ref Missing, ref Missing);
WordApp.Activate();
}
public void CloseDocument()
{
WordApp.Documents.Close(ref Save, ref OrigFormat, ref RouteDoc);
}
}
我在打开每个文档后执行CloseDocument()方法。任何人对此有一些了解吗?
答案 0 :(得分:5)
WordApp.Quit()
将退出该应用程序。
但是,最安全的方法是获取进程的句柄并终止winword进程。在C#中,以下代码会这样做:
foreach (Process p in Process.GetProcessesByName("winword"))
{
if (!p.HasExited)
{
p.Kill();
}
}
原因是它经常发生(我假设,特别是因为你正在测试不是由Word创建的文档),Word会挂起一个打开的消息框,例如:修复对话框。在这种情况下,终止进程是关闭应用程序的最简单方法。
我建议您先使用Application.Quit
尝试关闭Word。如果这不起作用,则表示输入文件存在问题(很可能是因为修复对话框阻止了Word)。您应该将此记录为日志中的错误,然后继续执行winword过程。
您可能遇到的另一个问题是Word的文档恢复功能在启动时阻止了应用程序(从而阻止在单击恢复对话框之前打开文档)。可以通过在启动Word之前删除HKCU和HKLM下的以下注册表项来禁用文档恢复(将Word 12.0替换为11.0,将Word XP替换为10.0):
Software\Microsoft\Office\12.0\Word\Resiliency
不言而喻,杀死Word是一种相当粗鲁的方法,然而,它简单而且相当健壮。上面的代码只会杀死用户的任何Word实例。如果你只想杀死一个特定的实例,事情变得更加困难。您必须检索特定Word实例的进程ID。通常,这可以通过搜索实例的窗口标题来完成,例如,使用FindWindowByCaption
和GetWindowThreadProcessId
等WinAPI函数。
答案 1 :(得分:2)
WordApp.Quit
后跟ReleaseComObect
。
答案 2 :(得分:1)
使用System.Runtime.InteropServices.ReleaseComObject
并传递您的单词对象实例WordApp
的引用。
答案 3 :(得分:0)
你们都是对的。我的问题是我在循环中创建ApplicationClass的实例。哎呦。然后我在关闭每个文档后使用Quit()来终止winword.exe进程。
谢谢你们!
-Nick