Word.Document Закрыть ComExceptionC#

Место общения программистов C#
Ответить
Anonymous
 Word.Document Закрыть ComException

Сообщение Anonymous »

У нас есть устаревший код, который поздно привязывается к Microsoft.Office.Interop.Word для выполнения различных действий с документами.
Этот код отлично работает уже много лет.
Решение написано на VB.NET и состоит из десятков проектов. Когда мы работаем с объектом Word.Document, он обычно называется oWDoc, поэтому мы можем использовать код типа

Код: Выделить всё

oWDoc = oWApp.Documents.Open(sFileName)
чтобы открыть документ Word из объекта Word.Application oWApp
После выполнения наших «материалов» нам часто нужно просто закрыть этот документ, не сохраняя изменений. Как это типично для устаревших приложений, эта функциональность не полностью единообразна во всем решении. Мы можем увидеть следующие варианты этой темы:

Код: Выделить всё

oWDoc.Close(False)
oWDoc.Close(0)
oWDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges)
oWDoc.Close(SaveChanges:=Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges)
Все эти варианты всегда работали. Наша первая версия этого программного обеспечения была написана в 2014 году, и часть этого кода прекрасно работала более 10 лет. Но теперь мы получаем ошибки:
System.Runtime.InteroptServices.COMException: «Команда не выполнена»
Что мне совершенно ни о чем не говорит. Я просматриваю код и обнаруживаю ошибку, и все, что я получаю, — это эта ошибка. Что ж, в объекте Exception есть «справочная ссылка» с текстом «wdmain11.chm#36966», но когда я ищу ее, в том числе в StackOverflow, я не получаю ничего, что помогло бы мне выяснить, в чем проблема. Для объекта Exception нет InnerException. Свойство Data объекта Exception не содержит никаких значений. Источник содержит «Microsoft Word».
Но все становится еще страннее.
Когда я смотрю на объект Word.Application oWApp, я вижу количество документов. Я сохраняю это в локальную переменную:

Код: Выделить всё

nOpenDocs = oWApp.Documents.Count
Я вызываю метод .Close любым из вышеперечисленных способов и помещаю его в Try/Catch — я ничего не делаю с перехваченным исключением. После этого проверяю еще раз

Код: Выделить всё

nOpenDocs = oWApp.Documents.Count
И я могу подтвердить, что количество документов уменьшилось на один.
Итак, несмотря на то, что это вызвало ошибку, .Close действительно удался.
Но что теперь? Я, конечно, могу просмотреть весь наш код и обернуть каждый вызов метода .Close в try/catch. И я мог бы даже добавить подсчет документов, просто чтобы быть уверенным, что после .Close действительно есть на один открытый документ меньше.
Но в конечном итоге что-то выдает ошибку, и я хотел бы устранить эту неполадку, чтобы я мог быть уверен, что я не просто замалчиваю реальную проблему. Но здесь я застрял. Как мне это отладить? Перехват исключения ничего не говорит мне, как описано выше. Я тоже ничего не вижу в средстве просмотра событий Windows. Или может я не там ищу?

Подробнее здесь: https://stackoverflow.com/questions/798 ... mexception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»