gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:23:44 26 4
gpt4 key购买 nike

来自msdn看来 IMessageFilter 并不能处理所有异常,例如,在某些时候,办公应用程序会“挂起”其对象模型,此时它无法被调用并抛出:0x800AC472 (VBA_E_IGNORE )

为了解决这个问题,您必须将调用放入循环中并等待其成功:

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

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

最佳答案

是的,这两种机制是独立的。 IMessageFilter 是一种通用 COM 机制,用于处理已陷入紧张状态并且在 60 秒内无法处理调用的 COM 服务器。 VBE_E_IGNORE 错误是 Excel 特有的错误,当 Excel 处于属性浏览器暂时禁用的状态时,就会发生该错误。将其视为一种模态状态,当 Excel 需要执行必须完成才能再次处理进程外调用之前的关键操作时,会有意打开它。如果你愿意的话,一把锁。它不像 IMessageFilter 那样与时间相关,而是纯粹与执行状态相关。 VSTO 团队的 Geoff Darst 在本文中提供了一些背景信息 MSDN forums thread .

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

关于excel - IMessageFilter 无法处理 0x800AC472 (VBA_E_IGNORE) 是否会使实现 IMessageFilter 变得无关紧要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14596337/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com