Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173

Использование MS Word в программе, проверить факт зависания

07.12.2013, 23:22. Показов 1427. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

При запуске программы на c# вызываю Word через интерфейс COM:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  
 WordApp WordApp = new WordApp();
...
WordApp.init()
...
 
  public class WordApp
    {
        public static Word.Application app = null;
 
        public bool init()
        {
            try
            {
                app = new Word.Application();
                app.Visible = false;
            }
            catch
            {
                return false;
            }
            return true;
        }
 
        public static void quit()
        {
            if (app != null)
            {
                try
                {
                    app.Quit();
                }
                catch { }
            }
        }
    }
Я использую потом этот Word для функции :
C#
1
2
if (WordApp.app.CheckSpelling(word))
{}
Возникает такая проблема. Если закрыть Word принудительно в то время, как работает моя программа на c#, то программа продолжает обращаться к этому WordApp как ни в чем ни бывало. И не выдает никаких ошибок.

Подскажите, как можно диагностировать, что вызванный программой экземпляр Word'а был закрыт (не доступен)?

Добавлено через 11 минут
Решил вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
   if (useWord)
            {
                try
                {
                    string a = WordApp.app.Caption;
                }
                catch
                {
                    MessageBox.Show("Прозошла ошибка MS Word в фоновом режиме.\r\nПриложение будет перезапущено.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Application.Restart();
                }
            }

Т.е. запрашиваю заголовок приложения. В случая эксепшна делаю перезапуск.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2013, 23:22
Ответы с готовыми решениями:

Проверить факт авторизации на сайте
Есть браузер и например... VK Пользователь ввел данные (логин и пароль) и вошел в вк, вопрос: Как проверить вошел ли он в ВК? То есть...

Проверить все Textbox на факт из заполнения
Здравствуйте. Передо мной стоит задача проверить все Textbox-ты на что они заполнены. Как это можно реализовать? С помощью for each не...

Как проверить съемный носитель на факт готовности
Кароч,есть проблема! задрало уже! программа на всех дисках ищет выбраный файл,но прикол в том что когда попадается диск что тупит или...

7
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.12.2013, 23:34
Suppir, думаю это оптимальный вариант. Можно мониторить процессы ворда, но ведь может работать какой-то другой документ, а ваш быть закрытым. Только для лучшей документации постарайтесь неочевидные проверки выносить в определенный метод (я вот не догадался бы, зачем заголовок тут нужен и как он влияет). А если есть желание закоментировать - типа "Здесь мы проверяем, не закрыли ли ворд", то намного лучше сделать такой метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private static bool IsWordClosed()
        {
            try
            {
                string a = WordApp.app.Caption;
                return false;
            }
            catch
            {
                return true;
            }
        }
и потом использовать, можно в вашем же цикле:
C#
1
2
3
4
5
6
7
8
   if (useWord)
            {
                if (IsWordClosed)
                {
                    MessageBox.Show("Прозошла ошибка MS Word в фоновом режиме.\r\nПриложение будет перезапущено.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Application.Restart();
                }
            }
Добавлено через 1 минуту
Тут метод из одной строчки, поэтому бросается в глаза, и сразу понятно, что проверка кривоватая, но правильная. Еще плюс: если вы потом узнаете более правильный метод проверки (например, флаг какой-нибудь или еще что), в методе исправили, а не лазить по всему коду. ??????? ПРОФИТ!
1
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
08.12.2013, 12:39  [ТС]
Тоже вариант, спасибо!

Добавлено через 12 часов 43 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
private static bool IsWordClosed()
Кстати, а можете пояснить, нужен ли метод static? Не вполне понимаю.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.12.2013, 13:25
Suppir, а, ну просто я писал у себя в студии, чтобы с форматированием и всем прочим не заморачиваться, поэтому осталось static. Вообще не нужно тут, да.

Хотя зависит от того, где у вас word. Если он - глобальная переменная, то лучше static, т.к. статики быстрее работают.
0
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
08.12.2013, 18:33  [ТС]
А, понятно.

Я пока не разбирался с этими static'ами. Написано:
Модификатор static используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту.

Читаю-читаю, но смысла не прибавляется Все-таки, нужно хотя бы пару книг по c# прочитать. А то я только MDSN и форумы гуглю.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.12.2013, 18:37
Suppir, статик нужно использовать, Если не используются поля класса. Типичный пример - статические методы класса Math.
0
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
08.12.2013, 19:26  [ТС]
Т.е. если я не вызывают какие-то переменные из класса, которые определены в его начале, то лучше использовать static?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.12.2013, 19:33
Suppir, да
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2013, 19:33
Помогаю со студенческими работами здесь

Составить блок схему к программе, определяющей факт существования треугольника
uses crt; var a,b:real; begin writeln('Vvedite ugli a,b '); readln(a,b); if a+b>180 then writeln('Takogo treugolnika ne sushestvuet...

Как В 1с Бухгалтерия 2.0 (8.2) Проверить Факт Оплаченности Счета Покуп
Добрый день! Пишу конфу, из которой данные импортируются в Бухгалтерию в виде документа "Счет на оплату покупателю". ...

Определить факт пересечения объектов и факт включения одного объекта в другой
Создается много плоских фигур(прямо, квадраты и другие) вершины задаются координатами. Помогите пожалуйста определить факт пересечения...

Как сделать задержку в программе без зависания формы
Доброго времени суток :) Никак не получается решить одну задачу. Допустим, есть форма с одной кнопкой. Нужно, чтобы через 3 секунды...

Утверждается, что разность любого натурального число и его цифр кратна 9. Проверить этот факт для всех чисел
Пожалуйста, помогите решить задачу по программированию: Утверждается, что разность любого натурального число и его цифр кратна 9....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru