Word.Interop文档已关闭

时间:2016-07-01 05:51:44

标签: c# .net ms-word office-interop comexception

我正在尝试将单词拼写检查集成到WinForms应用程序中。到目前为止,互操作性一直是后方的严重痛苦。经过几个小时的乱搞,我终于得到了实际的拼写检查。 CheckSpellingOnce以及底层的CheckSpelling方法按预期执行,但只要我调用GetSpellingSuggestions,应用程序就会抛出...

  

抛出异常:ClosedCaption.Spelling.dll中的“System.Runtime.InteropServices.COMException”附加信息:此命令不是   可用,因为没有文档打开。

第一个想法是底层COM对象与其相应的包装器断开连接,因为_wordApp是从与创建的不同的线程调用的。所以我尝试在CheckSpelling()中调用它,遗憾的是结果相同。我还尝试打开和关闭文档,向现有应用程序实例添加新文档,以及从_document对象本身获取应用程序(_document.Application.GetSpellingSuggestions)。

那是什么?

附加信息:当定时器事件被触发时(一旦用户停止在RichTextField中键入),从UI调用CheckSpellingOnce方法 - 所以多次 - 使用相同的_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();
    }

1 个答案:

答案 0 :(得分: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;
        }

这就是我打开文档的方式(内存中)。

将可见参数设置为&#39; true&#39;解决了问题 - 但由于某些原因(在我的情况下是预期的)保持应用程序进程在后台运行。 我的理论是winword.exe在调用Document.CheckSpelling()之类的方法之前保持不可见 - 这实际上调用了Word GUI。

如果有人需要,可以提供更多代码。

感谢您的建议,干杯!