从msdn看来,IMessageFilter似乎不能处理所有的异常,例如,在某些情况下,office应用程序“挂起”他们的对象模型,在这种情况下它不能被调用并抛出:0x800AC472 (VBA_E_IGNORE)
为了解决这个问题,你必须把你的调用放在一个循环中,并等待它成功:
while(true)
{
try
{
office_app.DoSomething();
break;
}
catch(COMException ce)
{
LOG(ce.Message);
}
}我的问题是:如果对office应用程序的对象模型的每次调用都需要这个样板代码,那么实现IMessageFilter还有什么意义吗
发布于 2013-01-30 16:29:14
是的,这两个机制是独立的。IMessageFilter是一种通用的COM机制,用于处理已经变得紧张的COM服务器,并且在60秒内不能处理调用。VBE_E_IGNORE错误高度特定于Excel,当它处于临时禁用属性浏览器的状态时会发生此错误。可以将其视为一种模式状态,当Excel需要执行必须完成才能再次处理进程外调用的关键操作时,有意将其打开。一个锁如果你愿意的话。它不像IMessageFilter那样与时间相关联,而是纯粹通过执行状态来关联。VSTO团队的Geoff Darst在这篇MSDN forums thread中提供了一些背景信息。
当然,不得不编写这样的重试循环是很可怕的。假设这是一个执行状态问题,并且假设您正在与Excel进行互操作,而用户也没有操作该程序,那么应该有一种方法来绕过这个问题。如果您正在从程序中的工作线程调用Excel,那么一定要考虑检查代码中线程之间的交互,以确保您不会创建这样一种情况,即两个线程在大致相同的时间发出Excel调用。
https://stackoverflow.com/questions/14596337
复制相似问题