7

msdn看来,它似乎IMessageFilter不能处理所有异常,例如,在某些时候,办公应用程序“暂停”它们的对象模型,此时它不能被调用并抛出:0x800AC472 (VBA_E_IGNORE)

为了解决这个问题,您必须将您的调用置于循环中并等待它成功:

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

我的问题是:如果每次调用办公应用程序的对象模型都需要这个样板代码,那么实施有什么意义IMessageFilter吗?

4

1 回答 1

8

是的,这两种机制是独立的。IMessageFilter 是一种通用的 COM 机制,用于处理已经紧张且在 60 秒内无法处理呼叫的 COM 服务器。VBE_E_IGNORE 错误高度特定于 Excel,当它处于属性浏览器暂时禁用的状态时会发生。将其视为一种模态状态,当 Excel 需要执行必须完成的关键操作才能再次处理进程外调用时,特意将其打开。如果你愿意的话,一把锁。它与时间无关,如 IMessageFilter,而纯粹与执行状态有关。VSTO 团队的 Geoff Darst 在此MSDN 论坛主题中提供了一些背景信息。

当然,必须编写这种重试循环是很可怕的。鉴于这是一个执行状态问题,并假设您正在与 Excel 进行互操作,而用户也没有操作该程序,那么应该有一种方法可以绕过这个问题。如果您从程序中的工作线程中获取 Excel,请考虑检查代码中线程之间的交互,以确保您不会创建线程大致同时发出 Excel 调用的情况。

于 2013-01-30T08:29:14.280 回答