#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 для просмотра расширений проводника и отключения ненужных/багнутых.
Комментариев нет:
Отправить комментарий