2009-04-14 4 views
0

私はrtfファイルがMS Wordによって正常に開かれたかどうかを判断する自動テストを作成しています。これまでは、特定のディレクトリ内のすべてのrtfsをループして開きました。後で、レポートを生成するために例外をキャッチする必要があります(単語をクラッシュさせたファイル名を記録します)。MS Office C#Consoleを閉じる

多数のファイルを処理しています。私のアプリケーションは現在、各ファイルに対して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() 

は、アプリケーションを終了します。

しかし、最も安全な方法は、プロセスへのハンドルを取得し、winwordプロセスを強制終了することです。 C#では、次のコードは、それを行うだろう:

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

理由は、例えば、Wordが開いているメッセージボックスがハングアップします(あなたがいないのWordで作成した文書をテストしている、特に以来、私は仮定)頻繁に起こるのだろうということです修復ダイアログ。この場合、プロセスを終了することがアプリケーションを終了する最も簡単な方法です。

まず、Application.Quitを使用してWordを閉じることをお勧めします。これが機能しない場合は、入力ファイルに問題があることを示します(修復ダイアログがWordをブロックしている可能性が高いため)。これをログにエラーとして記録してから、winwordプロセスを終了してください。

別の問題に直面する可能性がありますWordのドキュメント回復機能は、起動時にアプリケーションをブロックしているため、リカバリダイアログボックスをクリックするまでドキュメントが開かれません。ドキュメントの回復が(Word 2003のとWordのXP用10.0 11.0と12.0を交換する)前にWordを起動するHKCUとHKLMの両方の下で、次のレジストリキーを削除することによって無効にすることができます。

Software\Microsoft\Office\12.0\Word\Resiliency 

それは殺すWordがあることは言うまでもないですしかし、むしろ失礼なアプローチですが、単純で堅牢です。上記のコードは、ユーザーのWordのインスタンスを強制終了します。あなたが特定のインスタンスだけを殺すには、より難しくなります。特定のWordインスタンスのプロセスIDを取得する必要があります。典型的には、これは、インスタンスのウィンドウタイトルを検索することによって行うことができる。 FindWindowByCaptionGetWindowThreadProcessIdのようなWinAPI関数を使用します。

2

WordApp.Quitと続き、ReleaseComObectはdance2dieと同様です。

0

すべて正しいです。私の問題は、ループ内でApplicationClassのインスタンスを作成していたことです。うわー。その後、各文書を閉じた後にQuit()を使用してwinword.exeプロセスを終了しました。

ありがとう!

-nick