13

Microsoft Word Interopを使用して、シソーラス辞書から単語の意味を取得する簡単なテストプログラムがあります。

using System;
using Word = Microsoft.Office.Interop.Word;

class Program
{
    static void Main(string[] args)
    {
        string word = "elite"; // = "common";

        var app = new Word.Application();
        var synInfo = app.SynonymInfo[word, Word.WdLanguageID.wdEnglishUS];

        if (synInfo.Found && synInfo.MeaningCount > 0)
        {
            foreach (var meaning in synInfo.MeaningList as Array)
                Console.WriteLine(meaning.ToString());
        }

        // release memory and quit Word app... (see below)
    }
}

Visual Studio2010で.Net4.0を使用し、Office12PIAを参照してMicrosoftOffice2010およびMicrosoftOffice2013Previewでこれを試しました。15万以上の異なる単語に対して、これは魅力のように機能します。しかし、いくつかの単語について、メソッドget_SynonymInfoが例外をスローすることに気付きました。

Unhandled Exception: System.Runtime.InteropServices.COMException: Insufficient memory or disk space.
   at Microsoft.Office.Interop.Word.ApplicationClass.get_SynonymInfo(String Word, Object& LanguageID)
   at WordInteropTest.Program.Main(String[] args) in Program.cs:line 11

私はこれらの言葉が例外を引き起こしていることを知っています:

  • エリート(ただし「エリート」は機能します)
  • 近く
  • タック
  • タック
  • ウォーキング
  • 機内で
  • 恐ろしい

これは例外とは何の関係もありませんが、完全なソースコードを提供するために、メモリを解放してWordアプリを適切に終了します。テストプログラムを終了すると、プロセスリストにmsword.exeが残っていません。

        // release memory and quit Word app... (continuing from above)
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(synInfo);
        app.Quit(Word.WdSaveOptions.wdDoNotSaveChanges);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app);

Microsoft Wordでシソーラスを手動で使用すると、すべての単語に対して適切な結果が得られます。

どうすれば例外を回避し、相互運用コードを使用して結果を得ることができますか?他のAPIを使用した有効な代替手段はありますか?


更新:ローカルプログラミングWebフォーラムで、このコードはOffice 2007で機能すると言われました。驚いたことに、機能します。しかし、この質問で述べたようにOffice 2010および2013プレビューでは、少なくとも私のコンピューター/VMでは機能しません。次に、Office12ではなくOffice14 PIAを参照しようとしましたが、Office2013Previewでは同じように動作します。

4

3 に答える 3

9

この問題は、Word 2010のコンピューターで再現できます。エラーコード(HResult)は-2146822464または0x800A16C0で、インターネット上には何も見つかりません。

Remouが指摘しているように、この問題は2002年にすでに存在していました。

これは、Wordの同義語リストに2つ以上のタイプの同義語が1つ以上含まれている場合に発生します(例:adj。/ v。n。/v。またはadj。/n。)。言語/辞書は関係ありません。たとえば、後者は単語を知らないため、ではエラーonboardを返しますが、では返しません。他の単語は両方の辞書に存在し、どちらの場合もエラーになります。wdEnglishUSwdEnglishUK

どうやらこれはバグであり、Word自体が問題なくすべてを表示するため、Wordの相互運用の問題にすぎません。私が知る限り、これが相互運用機能で同義語情報を取得できる唯一の方法であり、回避策はありません。

于 2013-02-21T23:02:17.493 に答える
0

MS Wordに「悪い」単語を入力し、その同義語を確認するとどうなりますか?そこでは機能しますか?APIで正常に処理されない追加のダイアログが表示される可能性がありますか?

于 2012-09-09T08:56:37.090 に答える
0

「ONE」という言葉でも同じ問題が発生します。私はそれを捕らえる例外リストを持っています...しかし170,000語で、私はそれらすべてを捕まえるとは思えません:)。これはすっごくイライラします。

「Excludes」を文字列としてDIMMEDし、次の行を使用して不適切な単語をキャッチするという疑似回避策があります。

InStr(Excludes、 "["&AddYourArrayWordHere& "]")Then AddYourArrayWordHere = ""

于 2021-05-01T22:22:18.050 に答える