2015-03-16 4 views
-1

У нас есть функция, которая должна получать диапазон просматриваемого текста в текстовом документе. Однако мы получаем COMException в первых нескольких строках функции. Функция вызывается с фиксированным таймером каждые 10 секунд.COMException, необработанный в MS Word

Мы имеем дело с этим в течение довольно долгого времени и будем благодарны за любую помощь/советы, спасибо.

private void GetViewedText() 
    { 
     // get the rectangle shown on the screen 
     IntPtr h = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; 

     h = FindWindowExW(h, new IntPtr(0), "_WwF", "");   
     h = FindWindowExW(h, new IntPtr(0), "_WwB", this.Application.ActiveDocument.Name); 

     h = FindWindowExW(h, new IntPtr(0), "_WwG", "Microsoft Word Document");  

     RECT tagRect = new RECT(); 
     GetWindowRect(h, out tagRect); 
     //------------------------------------------------------------------------------------------------------- 

     //get the range in the doc from the rect 
     // problem with "ActiveDocument" or "ActiveWindow" 
     Word.Range r1 = (Word.Range)this.Application.ActiveWindow.RangeFromPoint(tagRect.left, tagRect.top); 

     Word.Range r2 = (Word.Range)this.Application.ActiveWindow.RangeFromPoint(tagRect.right, tagRect.bottom); 

     Word.Range r = this.Application.ActiveDocument.Range(r1.Start, r2.Start); 
     //------------------------------------------------------------------------------------------------------- 

     //for each paragraph we increase the number of times read it and change the color 
     for (int p = 1; p <= r.Paragraphs.Count; p++) 
     { 
      Word.Range rPar = document.Range(r.Paragraphs[p].Range); 
      Word.Range rParNum = document.Range(rPar.Start, rPar.Start + 1); 
      Word.Range rParText = document.Range(rPar.Start + 1, rPar.End); 
      try 
      { 
       int parNum = Int32.Parse(rParNum.Text); 
       paragraphs[parNum].ReadParagrafh(); 
       if (paragraphs[parNum].GetCounter() == 1) 
       { 
        rParText.HighlightColorIndex = Word.WdColorIndex.wdYellow; 
       } 
       else if (paragraphs[parNum].GetCounter() == 2) 
       { 
        rParText.HighlightColorIndex = Word.WdColorIndex.wdBrightGreen; 
       } 
       else 
       { 
        rParText.HighlightColorIndex = Word.WdColorIndex.wdGreen; 
       } 
      } 
      catch 
      { 
       continue; 
      } 
     } 
    } 
+1

Для начала, какая линия выбрасывает исключение? И что такое сообщение об исключении? –

+0

Когда мы запускаем его, строка, которая генерирует исключение: Word.Range rPar = document.Range (r.Paragraphs [p] .Range); Исключение: COMException не был обработан кодом пользователя (я не могу найти способ добавления экрана печати): Исключение типа «System.Runtime.InteropServices.COMException» произошло в WordAddIn1.dll, но не было обработано пользователем код Дополнительная информация: Тип несоответствия – lironlahav

ответ

0

установил ее, пришлось удалить document.Range таким образом, новая линия:

Word.Range RPAR = r.Paragraphs [р] .Range;

0

Вы рушитесь из-за ссылки на индекс на основе 0?

for (int p = 1; p <= r.Paragraphs.Count; p++) 

изменения в

for (int p = 0; p < r.Paragraphs.Count; p++) 

Так много вещей 0 на основе. Допустим, у вас есть 4 параграфа. Внутренне к документу, они ссылаются как

paragraph[0], paragraph[1], paragraph[2], paragraph[3] 

или

paragraph[1], paragraph[2], paragraph[3], paragraph[4] 

Граф пунктов может быть 4, но ссылаются как 0-3 ... Вещи, возможно, работали отлично, например: 10 абзацев, и он работал с 1-9 всех действительных (поскольку 10 записей были бы 0-9), но тогда, когда вы пробовали 10-го, такой ссылки не существует.

Отклики комментарий ...

С 1 на основе, может быть, вы должны попытаться предварительно проверки NULL диапазона?

if(r.Paragraphs[p].Range == null) 
    continue; 

Word.Range rPar = document.Range(r.Paragraphs[p].Range); 
+0

Нет, количество абзацев начинается с 1, это не причина. некоторые другие ответы предлагают права администратора для COM-объектов, но я - администратор на компьютере: \ – lironlahav

+0

@lironlahav, обновленный ответ ... возможно, проверьте наличие null перед назначением? – DRapp

+0

он по-прежнему выходит с тем же COMException – lironlahav

 Смежные вопросы

  • Нет связанных вопросов^_^