2016-07-01 3 views
0

Я пытаюсь интегрировать проверку правописания слов в приложение WinForms. До сих пор в interop lib была сильная боль в тылу. После многих часов беспорядков с ним я наконец получил реальную проверку орфографии, чтобы работать. CheckSpellingOnce, а также основные методы CheckSpelling, как ожидалось, но как только я называю GetSpellingSuggestions, приложение бросает ...Word.Interop document closed

Исключение брошено: «System.Runtime.InteropServices.COMException» в ClosedCaption. Spelling.dll Дополнительная информация: Эта команда не доступна , потому что документ не открыт.

Первая идея состояла в том, что лежащие в основе COM-объект отсоединяется от его соответствующей обертки, поскольку _wordApp вызывается из другого потока, чем он был создан. Поэтому я попробовал называть его из CheckSpelling(), к сожалению, с теми же результатами. Я также попытался открыть и закрыть документ, добавив новый документ в существующий экземпляр приложения, а также получить приложение из самого объекта _document (_document.Application.GetSpellingSuggestions).

Так что же дает?

Дополнительная информация: метод CheckSpellingOnce вызывается из пользовательского интерфейса при запуске события таймера (после того, как пользователь перестает печатать на RichTextField) - так много раз - используя тот же объект _wordApp, поскольку я пытаюсь избежать запуска несколько экземпляров winword.exe.

/// <summary> 
    /// Checks spelling with the text from the provided richtextbox in a new thread. 
    /// </summary> 
    public void CheckSpellingOnce() 
    { 
     _checkerThread = new Thread(new ThreadStart(CheckSpelling)); 
     _checkerThread.Start(); 
    } 

    /// <summary> 
    /// Checks the spelling of a richtextbox. Raises an event with the result when done. 
    /// </summary> 
    private void CheckSpelling() 
    { 
     if (_shouldBeChecking) 
     { 
      RaiseStatusChanged(SpellCheckStatus.Working); 
      Word.ProofreadingErrors toReturn = null; 
      UpdateStringFromTextBox(); 

      if (!string.IsNullOrEmpty(_fromTextBox)) 
      { 
       _document.Content.Delete(); 
       _document.Words.First.InsertBefore(_fromTextBox); 

       _document.Content.LanguageID = _language; //Must be set specifically here for some f***d reason. 

       toReturn = _document.SpellingErrors; 

       RaiseSpellingChecked(toReturn); 
       RaiseStatusChanged(SpellCheckStatus.Idle); 
      } 
     } 
    } 

    public Word.SpellingSuggestions GetSpellingSuggestions(string word) 
    { 
     //throw new NotImplementedException(); 
     Word.SpellingSuggestions toReturn = _wordApp.GetSpellingSuggestions(word, _missing, _missing, _missing, _missing, _missing, _missing); 
     return toReturn; 
    } 

Даже при такой реализации GetSpellingSuggestions, он жалуется на линии «toReturn», а не на тех, которые над ним ...

 public void GetSpellingSuggestions(string word) 
    { 
     //throw new NotImplementedException(); 
     var _suggestionThread = new Thread(new ThreadStart(() => 
     { 
      _document.Content.Delete(); 
      _document.Words.First.InsertBefore(word); 

      _document.Content.LanguageID = _language; 
      Word.SpellingSuggestions toReturn = _wordApp.GetSpellingSuggestions(word, _missing, _missing, _missing, _missing, _missing, _missing); 
      Debug.Print(toReturn[0].ToString()); 
     })); 
     _suggestionThread.Start(); 
    } 
+0

Вы посмотрели [это] (http://stackoverflow.com/questions/9718687/spell-checking-in-c-sharp-using-word-interop) Вопрос? –

+0

@JeroenHeier У меня - нет радости. –

+0

Ошибка говорит: «Нет документа открыта» _, поэтому сомнительно, что это проблема с потоками. Кроме того, COM-потоковые модели здесь не применяются, потому что мы имеем дело с несколькими процессами. – MickyD

ответ

1
 /// <summary> 
     /// Opens a Word interop lib document. 
     /// </summary> 
     /// <returns></returns> 
     private Word._Document OpenDocument() 
     { 
      object visible = false; 

      _document = _wordApp.Documents.Add(_missing, _missing, _missing, visible); 
      return _document; 
     } 

Это было, как я открыл свой документ (в памяти).

Настройка видимого параметра на «истина» решает проблему, но по какой-либо причине процесс приложения работает в фоновом режиме (как это предусмотрено в моем случае). Моя теория заключается в том, что winword.exe остается невидимым до тех пор, пока не вызывается метод Document.CheckSpelling(), который фактически вызывает графический интерфейс Word.

Может предоставить больше кода, если это необходимо.

Спасибо за предложения, приветствия!

+0

Кто бы мог подумать. Рад, что у тебя это получилось :) – MickyD

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

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