IMessageFilter无法处理0x800AC472(VBA_E_IGNORE)是否使实现IMessageFilter无关紧要?

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

为了解决这个问题,你必须把你的呼叫放在一个循环中,等待它的成功:

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

我的问题是:如果这个样板代码对于每个应用程序的对象模型的调用都是必需的,那么在实现IMessageFilter是否有任何意义?

是的,这两个机制是独立的。 IMessageFilter是一个通用的COM机制,用于处理已经过时并且不能处理60秒呼叫的COM服务器。 VBE_E_IGNORE错误对于Excel来说是高度特定的,当它进入属性浏览器被暂时禁用的状态时会发生。 将其视为一种模式状态,当Excel需要执行必须完成的关键操作时才有意打开,然后才能再次处理进程外调用。 如果你愿意的话。 它不像时间,像IMessageFilter,但纯粹由执行状态。 VSTO团队的Geoff Darst在此MSDN论坛主题中给出了一些背景信息。

不得不写这些types的重试循环当然是可怕的。 考虑到这是一个执行状态问题,并且假设您正在与Excel进行交互操作,而用户也无法操作该程序,应该有办法解决这个问题。 如果您正在从程序中的工作线程调用Excel,那么请考虑检查代码中线程之间的交互,以确保您不会创build线程几乎同时发出Excel调用的情况。