2009-04-14 180 views
0

我正在写一个自动化测试,以确定rtf文件是否被MS Word成功打开。到目前为止,我循环遍历给定目录中的所有rtfs并打开它们。稍后,我将不得不捕捉异常来生成报告(记录崩溃文字的文件名)。关闭微软Office C#控制台

我正在处理大量的文件。我的应用程序正在为每个文件打开一个新的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()方法。任何人都有这方面的见解?

回答

5
WordApp.Quit() 

将退出应用程序。

但是,最安全的方法是获取进程的句柄并杀死双字节进程。在C#下面的代码将做到这一点:

foreach (Process p in Process.GetProcessesByName("winword")) 
{ 
    if (!p.HasExited) 
    { 
     p.Kill(); 
    } 
} 

的原因是,它会经常发生(我假设,特别是因为你正在测试不通过Word中创建的文档),Word将用开放的消息框挂,例如一个修复对话框。在这种情况下,关闭应用程序是最简单的方法。

我建议你先试着用Application.Quit关闭Word。如果这不起作用,则表示输入文件存在问题(很可能是因为修复对话框阻止了Word)。您应该将其记录为日志中的错误,然后继续查杀winword进程。

您可能会遇到的另一个问题是Word的文档恢复功能在启动时阻止应用程序(并因此阻止在单击恢复对话框之前打开文档)。文件恢复可以通过在两个HKCU和HKLM删除以下注册表项启动Word之前被禁用(用11.0替代12.0 Word 2003和10.0的Word XP):

Software\Microsoft\Office\12.0\Word\Resiliency 

不用说,杀人的话是一个相当粗鲁的方法,但是,它很简单,相当强大。上面的代码将会为用户终止任何Word实例。如果你想杀死一个特定的实例,事情会变得更加困难。您将不得不检索特定Word实例的进程ID。典型地,这可以通过搜索实例的窗口标题来完成,例如,使用WinAPI函数,如FindWindowByCaptionGetWindowThreadProcessId

2

WordApp.Quit其次是ReleaseComObect如dance2die所述。

0

你们都是对的。我的问题是我在循环内创建了一个ApplicationClass实例。哎呦。然后我在关闭每个文档后使用Quit()来杀死winword.exe进程。

谢谢你们!

- 尼克