Закройте консоль MS Office C # - PullRequest
       25

Закройте консоль MS Office C #

0 голосов
/ 15 апреля 2009

Я пишу автоматизированный тест, чтобы определить, успешно ли открываются файлы rtf в MS Word. До сих пор я просматривал все rtfs в данном каталоге и открывал их. Позже мне придется отлавливать исключения для создания отчета (записать имя файла, в котором произошло сбой слова).

Я обрабатываю большое количество файлов. Мое приложение в настоящее время открывает новый экземпляр 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 () после открытия каждого документа. Кто-нибудь может рассказать мне об этом?

Ответы [ 4 ]

5 голосов
/ 15 апреля 2009
WordApp.Quit() 

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

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

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

Причина в том, что часто (я предполагаю, особенно если вы проверяете документы, созданные не Word), 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 для пользователя. Если вы хотите убить только конкретный экземпляр, все становится сложнее. Вам придется получить идентификатор процесса конкретного экземпляра Word. Обычно это можно сделать путем поиска заголовка окна экземпляра, например, используя функции WinAPI, такие как FindWindowByCaption и GetWindowThreadProcessId.

2 голосов
/ 15 апреля 2009

WordApp.Quit с последующим ReleaseComObect, как сказал dance2die.

1 голос
/ 15 апреля 2009

Используйте System.Runtime.InteropServices.ReleaseComObject
и передайте ему ссылку на экземпляр вашего объекта Word, WordApp.

0 голосов
/ 15 апреля 2009

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

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

-Nick

...