首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IMessageFilter无法处理0x800AC472 (VBA_E_IGNORE)是否会使实现IMessageFilter变得无关紧要?

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

Stack Overflow用户
提问于 2013-01-30 11:46:54
回答 1查看 1.6K关注 0票数 7

msdn看来,IMessageFilter似乎不能处理所有的异常,例如,在某些情况下,office应用程序“挂起”他们的对象模型,在这种情况下它不能被调用并抛出:0x800AC472 (VBA_E_IGNORE)

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

代码语言:javascript
复制
while(true)
{
    try
    {
        office_app.DoSomething();
        break;
    }
    catch(COMException ce)
    {
        LOG(ce.Message);
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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调用。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14596337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档