Спрашивающий
Программирование в WORD средствами Microsoft.Office.Interop.Word и различные ошибки.

Вопрос
-
Здравствуйте! Помогите, пожалуйста при попытке поиска текста через:
private void SearchReplace()
{
Word.Find findObject = Application.Selection.Find;
findObject.ClearFormatting();
findObject.Text = "find me";
findObject.Replacement.ClearFormatting();
findObject.Replacement.Text = "Found";
object replaceAll = Word.WdReplace.wdReplaceAll;
findObject.Execute(ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref replaceAll, ref missing, ref missing, ref missing, ref missing);
}
Выскакивает ошибка:
System.AccessViolationException: "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Да и вообще при любой попытке поиска в Word через C# выскакивает эта ошибка, может кто-то сталкивался?12 февраля 2022 г. 20:05
Все ответы
-
У меня такой ошибки не наблюдается. Word 2016 на Windows 10. Сдается мне, это у вас локальная проблема, которая должна решиться либо восстановлением/переустановкой Office, либо передобавлением ссылки на COM-библиотеку правильной версии. См. например: https://social.msdn.microsoft.com/Forums/vstudio/en-US/19720492-f2c7-4b7b-9046-b3058bb90f06/word2007-access-violation-exception-was-unhandled-when-execute-selectionfindexecute?forum=vsto15 февраля 2022 г. 5:08
-
На двух компьютерах пробовал:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;
using System.Reflection;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void SearchReplace()
{
Word._Application application;
object missingObj = System.Reflection.Missing.Value;
object trueObj = true;
object falseObj = false;
application = new Word.Application();
Word.Find findObject = application.Selection.Find;
findObject.ClearFormatting();
findObject.Text = "find me";
findObject.Replacement.ClearFormatting();
findObject.Replacement.Text = "Found";
object replaceAll = Word.WdReplace.wdReplaceAll; findObject.Execute();
}
private void button1_Click(object sender, EventArgs e)
{
Word._Application application;
Word._Document document;
Object missingObj = System.Reflection.Missing.Value;
Object trueObj = true;
Object falseObj = false;
//создаем обьект приложения word
application = new Word.Application();
document = application.Documents.Open(@"C:\Users\KlukaDO\Desktop\Программирование\11111.docx");
application.Visible = true;
SearchReplace();
}
}
}
Я где-то косячу, но хоть убейте, не понимаю((
15 февраля 2022 г. 9:58 -
Ваш второй пример очень странный, вы открываете docx в одном экземпляре Application, а ищете уже в другом. И в метод Execute ничего не передаете, а в первом примере передавали кучу missing'ов.
Я тоже проверил на двух компьютерах, с разными версиями Office, и ваш первый пример работает и делает абсолютно то, что нужно, заменяет find me на Found. Если не передавать в Execute параметры, то замены не происходит (хотя непонятно, почему). Но и тут с AccessViolation не падает.
15 февраля 2022 г. 17:24