2009-04-14 18 views
0

Ich schreibe einen automatisierten Test, um festzustellen, ob RTF-Dateien erfolgreich von MS Word geöffnet werden. Bisher habe ich alle rtfs in einem bestimmten Verzeichnis durchlaufen und geöffnet. Später muss ich Ausnahmen abfangen, um einen Bericht zu generieren (logge den Namen der Datei ein, der das Wort abstürzte).Schließen MS Office C# Konsole

Ich verarbeite eine große Anzahl von Dateien. Meine Anwendung öffnet derzeit eine neue Instanz von Word für jede Datei. Kann mir jemand sagen, wie man Word schließt?

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); 
    } 

} 

Ich führe die CloseDocument() Methode aus, nachdem jedes Dokument geöffnet ist. Hat jemand einen Einblick für mich?

Antwort

5
WordApp.Quit() 

wird die Anwendung beenden.

Der sicherste Weg ist jedoch, einen Griff zum Prozess zu bekommen und den Winword-Prozess zu beenden. In C# tun würde, der folgende Code, dass:

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

Der Grund dafür ist, dass es häufig geschieht (ich nehme an, zumal Sie testen Dokumente erstellt nicht von Word), die Word mit einer geöffneten Nachricht Box hängen, zum Beispiel ein Reparaturdialog In diesem Fall ist das Beenden des Prozesses der einfachste Weg, um die Anwendung zu schließen.

Ich würde vorschlagen, dass Sie zuerst versuchen, Word mit Application.Quit zu schließen. Wenn dies nicht funktioniert, weist dies auf ein Problem mit der Eingabedatei hin (höchstwahrscheinlich, weil ein Reparaturdialog Word blockiert). Sie sollten dies als einen Fehler in Ihrem Protokoll aufzeichnen und dann den WinWord-Prozess beenden.

Ein weiteres Problem, dem Sie möglicherweise gegenüberstehen, ist die Dokumentwiederherstellungsfunktion von Word, die die Anwendung beim Start blockiert (und verhindert, dass ein Dokument geöffnet wird, bis das Wiederherstellungsdialogfeld entfernt wird). Dokumentwiederherstellung können durch das Löschen der folgenden Registrierungsschlüssel sowohl unter HKCU und HKLM vor Beginn Wort (ersetzen 12.0 mit 11.0 für Word 2003 und 10,0 für Word XP) deaktiviert werden:

Software\Microsoft\Office\12.0\Word\Resiliency 

Es versteht sich, dass das Töten Wort ein eher unhöflicher Ansatz, jedoch ist es einfach und ziemlich robust. Der obige Code wird nur jede Instanz von Word für einen Benutzer beenden. Wenn Sie nur eine bestimmte Instanz töten wollen, werden die Dinge schwieriger. Sie müssten die Prozess-ID einer bestimmten Word-Instanz abrufen. Typischerweise kann dies durch Suchen nach dem Fenstertitel der Instanz, z.B. Verwenden von WinAPI-Funktionen wie FindWindowByCaption und GetWindowThreadProcessId.

2

WordApp.Quit gefolgt von ReleaseComObect wie gesagt von dance2die.

0

Sie sind alle richtig. Mein Problem, was ich eine Instanz von ApplicationClass innerhalb einer Schleife erstellt habe. Hoppla. Ich habe dann das Quit() nach dem Schließen jedes Dokuments verwendet, um den winword.exe-Prozess zu beenden.

Danke euch!

-Nick

Verwandte Themen