Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2018, 19:15   #1
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию Код создания документа word вызывает ошибку проводника explorer.exe

Здравствуйте Уважаемые программисты!
Мой код (c# winforms vs2010) после закрытия (после завершения работы программы) вызывает появление ошибки проводника "explorer.exe" (на компьютерах с winxp и win7), т.е. после того как воспользовалась событием "private void btn_Click" и закрыла программу, первый щелчок правой клавишей мыши, например, на рабочем столе или по папке, вызывает появление ошибки проводника.
Подскажите пожалуйста, из-за чего может возникать ошибка проводника, что не так в коде ниже (не корректно выгружаю com-объекты)?
Привожу фрагмент кода:

Код:
private void btn_Click(object sender, EventArgs e)
        {
            Word.Application word = null;
            Word.Documents docs = null;
            Word.Document doc = null;
            Word.Table oTable1 = null;
            Word.Table oTable = null;
            Word.Range oRange = null;
            Word.Paragraph oParag = null;
            Word.Paragraph oPara2 = null;
            Word.Template oTpl = null;

            try
            {
                if (Process.GetProcessesByName("WINWORD").Length == 0)
                {
                    word = new Word.Application();
                }
                else
                {
                    word = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
                }

                word.Visible = true;
                word.WindowState = Word.WdWindowState.wdWindowStateMinimize;

                docs = (Word.Documents)word.Documents;
                object templateName = @"c:\a3.dot";
                object missing = Type.Missing;
                object openVisible = true;
                object documentType = Word.WdDocumentType.wdTypeDocument;
                doc = docs.Add(ref templateName, ref missing, ref documentType, ref openVisible);
                doc.ActiveWindow.WindowState = Word.WdWindowState.wdWindowStateMinimize;

                waitForm = new Form4();
                waitForm.TopMost = true;
                waitForm.StartPosition = FormStartPosition.CenterParent;
                waitForm.Show();
                if (waitForm.StartPosition == FormStartPosition.CenterParent)
                {
                    var x = Location.X + (Width - waitForm.Width) / 2;
                    var y = Location.Y + (Height - waitForm.Height) / 2;
                    waitForm.Location = new Point(Math.Max(x, 0), Math.Max(y, 0));
                }
                waitForm.Refresh();

//........

                object oRngEnd = word.Selection.GoTo(Word.WdGoToItem.wdGoToLine, Word.WdGoToDirection.wdGoToLast);
                object oAutoText = "table";
                object objTrue = true;
                oTpl = (Word.Template)doc.get_AttachedTemplate();
                oPara2 = doc.Paragraphs.Add(oRngEnd);
                oPara2.Range.Text = "";
                oPara2.Range.Font.Size = 11;
                doc.Paragraphs.Add(oRngEnd);
                doc.Paragraphs.Add(oRngEnd);
                doc.Paragraphs.Add(oRngEnd);
                doc.Paragraphs.Add(oRngEnd);
                oPara2.Range.Select();
                oTpl.AutoTextEntries.get_Item(ref oAutoText).Insert(word.Selection.Range, ref objTrue);

                word.Selection.GoTo(Word.WdGoToItem.wdGoToLine, Word.WdGoToDirection.wdGoToFirst);

                object oTemplate_null = "";
                doc.set_AttachedTemplate(oTemplate_null);

                doc.ActiveWindow.View.DisplayPageBoundaries = true;
                doc.ActiveWindow.ActivePane.View.Zoom.PageFit = Word.WdPageFit.wdPageFitBestFit;
                doc.ActiveWindow.WindowState = Word.WdWindowState.wdWindowStateMaximize;

                waitForm.Close();

                doc.Activate();
                word.Activate();
            }
            catch
            {
                waitForm.Close();

                if (oTpl != null) Marshal.FinalReleaseComObject(oTpl); oTpl = null;
                if (oPara2 != null) Marshal.FinalReleaseComObject(oPara2); oPara2 = null;
                if (oParag != null) Marshal.FinalReleaseComObject(oParag); oParag = null;
                if (oRange != null) Marshal.FinalReleaseComObject(oRange); oRange = null;
                if (oTable != null) Marshal.FinalReleaseComObject(oTable); oTable = null;
                if (oTable1 != null) Marshal.FinalReleaseComObject(oTable1); oTable1 = null;
                if (doc != null) Marshal.FinalReleaseComObject(doc); doc = null;
                if (docs != null) Marshal.FinalReleaseComObject(docs); docs = null;
                if (word != null) Marshal.FinalReleaseComObject(word); word = null;

                return;
            }
            finally
            {
                if (oTpl != null) Marshal.FinalReleaseComObject(oTpl); oTpl = null;
                if (oPara2 != null) Marshal.FinalReleaseComObject(oPara2); oPara2 = null;
                if (oParag != null) Marshal.FinalReleaseComObject(oParag); oParag = null;
                if (oRange != null) Marshal.FinalReleaseComObject(oRange); oRange = null;
                if (oTable != null) Marshal.FinalReleaseComObject(oTable); oTable = null;
                if (oTable1 != null) Marshal.FinalReleaseComObject(oTable1); oTable1 = null;
                if (doc != null) Marshal.FinalReleaseComObject(doc); doc = null;
                if (docs != null) Marshal.FinalReleaseComObject(docs); docs = null;
                if (word != null) Marshal.FinalReleaseComObject(word); word = null;
            }

        }

Последний раз редактировалось ольгаг; 05.06.2018 в 19:18.
ольгаг вне форума Ответить с цитированием
Старый 05.06.2018, 19:26   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Возьмите библиотеку на основе Open XML (например https://github.com/xceedsoftware/DocX) и не парьтесь с COM.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.06.2018, 11:03   #3
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Подскажите пожалуйста, библиотека DocX может работать с таблицами, шаблонами, автотекстом (есть у меня в коде)?
ольгаг вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового документа Word на основе текста другого документа Word. mihades Microsoft Office Word 11 24.08.2017 08:57
На чем реализовать - программа для создания Word документа с запрошенными данными(VB6?) Jordan_from_Surgut Microsoft Office Word 4 19.04.2015 00:55
Код вызывает ошибку системы.нужен совет Ev1L Общие вопросы C/C++ 2 05.10.2012 23:56
Доработать код для создания exe файла sss-777 Помощь студентам 0 18.05.2010 13:32
Ajax - вызывает ошибку в IE kalexi JavaScript, Ajax 2 04.05.2010 17:03