2

私のアプリケーションでは、「アクティブ レポート」機能に Word 相互運用機能を使用しています。Word ドキュメントがアプリケーションから起動されると、EventWaitHandle を設定して、ドキュメントが閉じられるまでアプリケーションを一時停止します (「モーダル」効果を作成します)。

 wh.WaitOne();

Application Quit イベントという単語にイベントを設定しました。次に、アプリケーションが続行するための待機 EventWaitHandle を設定します。

wordGenerator.WordApplication.ApplicationEvents2_Event_Quit += WordApplication_ApplQuit;

private void WordApplication_ApplQuit()
    {
        wh.Set(); // signal that word has closed

        wordGenerator.Dispose();
        wordGenerator = null;
    }

これが呼び出された後、アプリケーションは保存された場所からドキュメントを読み取り、データベースに保存します。すべてうまくいきます。UNLESS ... ユーザーがドキュメントに変更を加え、CTRL + S を使用せずに閉じるをクリックすると、「変更を保存しますか」というプロンプトが表示されます。

この例では、Word で [閉じる] をクリックするとすぐに終了イベントが発生しますが、変更を保存するためのダイアログが表示されている間、Word は開いたままになります。その後、アプリケーションは引き続き実行され、ドキュメントを読み取ってデータベースに保存しようとすると、「ドキュメントは別のプロセスで使用されています」という IO 例外が発生します。Word とアプリケーションが互いに待機しているように見えるため、待機して再試行しても機能しません。

他に使用できるイベントはありますか?おそらくユーザーが保存したくないので、アラートをバイパスして自動的に保存することはできません。

4

1 に答える 1

1

問題は解決しました...今回は簡単です。Dispose コードを .Set() の上に移動しました。

private void WordApplication_ApplQuit()
{

    wordGenerator.Dispose();
    wordGenerator = null;

    wh.Set(); // signal that word has closed

}
于 2013-05-29T18:14:23.623 に答える