7

msdnからは、すべての例外を処理するわけではないようですIMessageFilter。たとえば、ある時点で、Officeアプリケーションはオブジェクトモデルを「一時停止」します。その時点では、オブジェクトモデルを呼び出すことができず、次のようにスローされます。0x800AC472 (VBA_E_IGNORE)

これを回避するには、呼び出しをループに入れて、成功するのを待つ必要があります。

while(true)
{
    try
    {
        office_app.DoSomething();
        break;
    }
    catch(COMException ce)
    {
        LOG(ce.Message);
    }
}

私の質問は、このボイラープレートコードがOfficeアプリのオブジェクトモデルへの呼び出しごとに必要な場合、実装する意味はありますIMessageFilterか?

4

1 に答える 1

8

はい、2つのメカニズムは独立しています。IMessageFilterは、緊張病になり、60秒間呼び出しを処理しないCOMサーバーを処理するための一般的なCOMメカニズムです。VBE_E_IGNOREエラーはExcelに非常に固有であり、プロパティブラウザが一時的に無効になっている状態になると発生します。これをモーダル状態と考えてください。Excelがアウトプロセス呼び出しを再度処理する前に完了する必要のある重要な操作を実行する必要がある場合に、意図的にオンになります。必要に応じてロックします。IMessageFilterのように時間とは関連付けられていませんが、純粋に実行状態によって関連付けられています。VSTOチームのGeoffDarstは、このMSDNフォーラムスレッドでいくつかの背景情報を提供しています。

もちろん、この種の再試行ループを作成する必要があるのは恐ろしいことです。これは実行状態の問題であり、ユーザーがプログラムを操作せずにExcelと相互運用していると仮定すると、問題を回避する方法があるはずです。プログラムのワーカースレッドからExcelを削除する場合は、コード内のスレッド間の相互作用を確認して、スレッドがほぼ同時にExcel呼び出しを発行するケースを作成しないようにすることを検討してください。

于 2013-01-30T08:29:14.280 に答える