2009-04-14 2 views
0

Я пишу автоматизированный тест, чтобы определить, будут ли файлы rtf успешно открываться MS Word. Пока я просматриваю все rtfs в заданном каталоге и открываю их. Позже мне придется поймать исключения, чтобы создать отчет (зарегистрировать имя файла, разбившее слово).Закрыть Консоль MS 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() 

выйдет из приложения.

Однако самым безопасным способом является получение дескриптора процесса и уничтожение процесса winword. В C# следующий код будет сделать это:

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

Причина заключается в том, что это будет происходить часто (я предполагаю, тем более, что вы тестируете документы, созданные не Word), что слово будет висеть с коробкой открытого сообщения, например, диалог восстановления. В этом случае убийство процесса - это самый простой способ закрыть приложение.

Я предлагаю вам сначала попытаться закрыть Word, используя Application.Quit. Если это не работает, это указывает на проблему с вашим входным файлом (скорее всего, из-за того, что диалог восстановления блокирует Word). Вы должны записать это как ошибку в своем журнале, а затем продолжить процесс winword.

Еще одна проблема, с которой вы можете столкнуться, - это функция восстановления документа Word, блокирующая приложение при запуске (и, таким образом, предотвращение открытия документа до тех пор, пока диалоговое окно восстановления не будет удалено). Восстановление документов можно отключить, удалив следующий раздел реестра при обоих HKCU и HKLM до начала Word (заменить 12,0 с 11,0 в Word 2003 и 10,0 для Word XP):

Software\Microsoft\Office\12.0\Word\Resiliency 

Само собой разумеется, что убийство Слово довольно грубый подход, однако, он прост и довольно прочен. Приведенный выше код просто убьет любой экземпляр Word для пользователя. Если вы хотите убить только конкретный экземпляр, все становится сложнее. Вам нужно будет получить идентификатор процесса для конкретного экземпляра Word. Обычно это можно сделать путем поиска заголовка окна экземпляра, например. используя функции WinAPI, такие как FindWindowByCaption и GetWindowThreadProcessId.

0

Все в порядке. Моя проблема в том, что я создал экземпляр ApplicationClass в цикле. Упс. Затем я использовал Quit() после закрытия каждого документа, чтобы убить процесс winword.exe.

Спасибо вам, ребята!

-Nick

Смежные вопросы