2009-04-14 5 views
0

J'écris un test automatisé pour déterminer si les fichiers rtf sont ouverts avec succès par MS Word. Jusqu'à présent, je boucle tous les fichiers rtfs dans un répertoire donné et les ouvre. Plus tard, je devrai attraper des exceptions pour générer un rapport (consigner le nom du fichier qui a écrasé le mot).Fermer MS Office C# Console

Je traite un grand nombre de fichiers. Mon application ouvre actuellement une nouvelle instance de Word pour chaque fichier. Quelqu'un peut-il me dire comment fermer 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); 
    } 

} 

J'exécute la méthode CloseDocument() après chaque document est ouvert. Quelqu'un a-t-il un aperçu pour moi?

Répondre

5
WordApp.Quit() 

quittera l'application. Cependant, le moyen le plus sûr est de maîtriser le processus et de supprimer le processus winword. En C# le code suivant ferait que:

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

La raison en est que cela se produira souvent (je suppose, d'autant plus que vous testez des documents créés non par Word) que Word se bloquer avec une boîte de message ouvert, par exemple une boîte de dialogue de réparation. Dans ce cas, la suppression du processus est le moyen le plus simple de fermer l'application.

Je suggère que vous essayez d'abord de fermer Word en utilisant Application.Quit. Si cela ne fonctionne pas, cela indique un problème avec votre fichier d'entrée (probablement parce qu'une boîte de dialogue de réparation bloque Word). Vous devez enregistrer cela comme une erreur dans votre journal, puis continuer à tuer le processus winword. Un autre problème que vous pouvez rencontrer est la fonctionnalité de récupération de document de Word qui bloque l'application au démarrage (et empêche ainsi l'ouverture d'un document tant que la boîte de dialogue de récupération n'est pas cliquée). récupération de document peut être désactivé en supprimant la clé de Registre suivante sous les deux HKCU et HKLM avant le démarrage Word (remplacer 12,0 avec 11,0 pour Word 2003 et 10,0 pour Word XP):

Software\Microsoft\Office\12.0\Word\Resiliency 

Il va sans dire que la Parole de tuer est une approche plutôt grossière, cependant, elle est simple et plutôt robuste. Le code ci-dessus va juste tuer n'importe quelle instance de Word pour un utilisateur. Si vous voulez tuer seulement un exemple spécifique, les choses deviennent plus difficiles. Vous devez récupérer l'ID de processus d'une instance Word spécifique. Typiquement ceci peut être fait en recherchant le titre de la fenêtre de l'instance, par ex. en utilisant des fonctions WinAPI comme FindWindowByCaption et GetWindowThreadProcessId.

2

WordApp.Quit suivi par ReleaseComObect comme dit par dance2die.

0

Vous avez tous raison. Mon problème ce que je créais une instance de ApplicationClass dans une boucle. Oups. J'ai ensuite utilisé le Quit() après la fermeture de chaque document pour tuer le processus winword.exe.

Merci les gars!

-Nick

Questions connexes