Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

Код создания документа word вызывает ошибку проводника explorer.exe

#c_sharp #winforms #ms_word


Мой код (c# winforms vs2010) после закрытия вызывает появление ошибки проводника
"explorer.exe" (на компьютерах с winxp и win7):

Подскажите пожалуйста, из-за чего может возникать ошибка проводника?
Привожу фрагмент кода:

    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;
            }

        }


Ошибка стала возникать после добавления в приложение работы с Word

Скриншот ошибки:



Сведения:


  Сигнатура проблемы:
  Имя события проблемы: APPCRASH
  Имя приложения: Explorer.EXE
  Версия приложения: 6.1.7601.17514
  Отметка времени приложения: 4ce7a144
  Имя модуля с ошибкой: ntdll.dll
  Версия модуля с ошибкой: 6.1.7601.18247
  Отметка времени модуля с ошибкой: 521eaf24
  Код исключения: c0000005
  Смещение исключения: 0000000000028389
  Версия ОС: 6.1.7601.2.1.0.256.48
  Код языка: 1049
  Дополнительные сведения 1: 0056
  Дополнительные сведения 2: 00565d7ce61ebbab216279960a6dd5b6
  Дополнительные сведения 3: 2480
  Дополнительные сведения 4: 2480f0afc22eea9532586bc57f7117f6

    


Ответы

Ответ 1



Проводник просто так не падает от работы с WinForms и Word Automation. Типично проблема связана с багами в его расширениях. Чтобы выявить источник ошибки, попробуйте следующее: Включить формирование дампов по инструкции Настроить студию на использование серверов символов Microsoft (Параметры - Отладка - Символы - Microsoft Symbol Servers) После ошибки найти файл с расширением dmp в %LOCALAPPDATA%\CrashDumps, открыть в студии и войти в отладку Изучите стек вызовов в момент падения, какие функции были вызваны и из каких DLL. Нужно смотреть на функции, расположенные ниже системных вызовов из ntdll и kernel32, это выглядит так: Если они относятся к стороннему ПО, попробуйте удалить или переустановить его. Если они относятся к ПО от Microsoft, нужно искать соответствующее исправление или сообщать о баге, если его нет. Можно также использовать утилиту ShellExView для просмотра расширений проводника и отключения ненужных/багнутых.

Комментариев нет:

Отправить комментарий