none
Программирование в WORD средствами Microsoft.Office.Interop.Word и различные ошибки. RRS feed

  • Вопрос

  • Здравствуйте! Помогите, пожалуйста при попытке поиска текста через:

    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=vsto
    15 февраля 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