Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > VB .NET > Проблемы обработки Word документов |
Автор: flog 15.1.2013, 15:54 | ||
Добрый вечер. Суть проблемы заключается в том что была написана программа которая должна была из множества файлов Word одного шаблона (в шаблоне расположены 99 таблиц) создавать 99 файлов одних и тех же таблиц формата Word. Реализовано все это было методом поиска по меткам в шаблоне. при переходе на более новые версии msWord(с 2007 на 2010) и VB(с 2008 на 2012). программа стала выдавать ошибки при сохранении, при закрытии, может вылететь(Подвиснуть) сама программа Word. До перехода было все нормально все работало. Причем ошибки могут вылетать не каждый раз. Помогите если сможете разобраться в чем проблема. при анализе исходного кода выдает следующие сообщение для инструкции Clipboard.Clear() CA2202 Не ликвидировать объекты несколько раз Объект "'mdO.Tables.GetEnumerator()'" можно удалять более одного раза в методе 'Form1.Button3_Click(Object, EventArgs)'. Чтобы избежать исключения System.ObjectDisposedException, следует вызывать метод "Dispose" для объекта только один раз.: Lines: 170 Отчеты кафедр Form1.vb 170 сам код процедуры:
|
Автор: diadiavova 16.1.2013, 09:14 |
Слишком много кода в одном методе. Код нечитабелен, особенно если писал его кто-то другой. Кроме того, неясно где здесь 170-я строка, здесь она какая? Но вообще, если бы код правилно был разбит на методы, то ты и сам нашёл бы проблему. Судя по сообщению у тебя один объект уничтожается более одного раза. Ищи где ты его удаляешь, по всей видимости в цикле и по всей видимости в этом цикле он не инициируется, таким образом при следующей итерации переменная может оказаться пустой. Находится это где-то недалеко от 170-ой строки кода. Кроме того, не забывай. что диспоуз обычно вызывается из метода клоуз, то есть подозрение более всего падает на строки типа md0.Close() ну или что-то в этом роде. |
Автор: flog 16.1.2013, 11:58 |
в данном фрагменте это 132 строка, все лишь очистка буфера обмена, да она в цикле по другому никак что бы не переполнить сам буфер обмена, перетаскивание таблиц происходит методом переноса через буфер, в цикле потому что таблицы иногда могут быть разорванными и они просто копируются кусками. строки типа md0.Close() - используются для закрытия документов естественно они тоже в цикле так как нужно перебрать все файлы из папки. при выполнении программы выдается ошибка вида - Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)) Отладчик:Перехвачено исключение: Button3_Click, Form1.vb строка 161 (к куске она 124 - перемещение курсора)- строка бывает разная но ошибка одна. Исключение перехвачено, а стек вызовов возвращен к состоянию на момент поступления вызова от пользовательского кода, где произошло исключение. В параметрах отладчика выбрано значение "Очистить стек вызовов от кадров необработанных исключений". Иногда эта ошибка не вылетает причем на одном и том же множестве файлов, один раз ошибка в другой все нормально проходит. такое ощущение складывается что это сама вордовская библиотека сбоит. хотя офис уже много раз переставлял причем разные версии и подключал разные версии библиотек. я то понимаю что там написано. только не пойму почему так получилось на уже давно отлаженной программе |
Автор: flog 16.1.2013, 15:53 |
поиграв с версиями фреймворк ничего не помогло выдает следующее исключение -Исключение:Вызвано: "Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))" (System.Runtime.InteropServices.COMException) Возникло System.Runtime.InteropServices.COMException: "Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))" - сбой при удаленном вызове процедуры 0x800706be ничего хорошего из этого не получил, то может пройти цикл 20 проходов и выдать ошибку то и 2 не может пройти может как ни то по другому можно передать таблицы из одного документа в другой не использую буфер обмена? |
Автор: diadiavova 16.1.2013, 22:41 | ||
Я с всто знаком очень поверхностно, так что вряд ли смогу помочь. Лучше всего на специализированном форуме спросить. На офсайте вроде есть на английском форум. Вообще с ком-взаимодействием такое бывает, иногда не нахожу ничего лучшего, как только обработать исключение и всё, что не проходит пропустить.
Таблицу можно в переменную скопировать, если правильно вопрос понял. А вообще, если формат документа docx, а не doc, то можно вообще без ком-библиотек обойтись http://www.microsoft.com/en-us/download/details.aspx?id=5124 там этих проблем точно не будет. |
Автор: diadiavova 16.1.2013, 23:03 |
В принципе справка по исключению http://support.microsoft.com/kb/329854/en-us Здесь правда говорится, что исключение может вылетать при подключении к другому компу, но это всё-таки ком-взаимодействие, так что фиг его знает, тут всё может случиться ![]() |