首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Excel触发IMessageFilter.RetryRejectedCall

使用Excel触发IMessageFilter.RetryRejectedCall
EN

Stack Overflow用户
提问于 2022-02-15 19:57:27
回答 1查看 68关注 0票数 0

我在自动化Excel。但是,我收到了用户报告,有时我的应用程序(它运行在与Excel独立的进程中),有时会在使用COM互操作调用Excel时无限期挂起。我想我已经将其归结为缺少在调用线程上注册的IMessageFilter (我启动并控制的STA线程),这样用户就可以选择取消他们的呼叫了。

IMessageFilter似乎起作用了。我已经实现了它,并在我的调用线程上注册了它。现在,如果我简单地跳转到VBA并调用Application.Wait(Now + TimeValue("0:00:30")) (即阻塞30秒),那么我的线程就会通过IMessageFilter.MessagePending()得到通知,这正是我想要的。但是,我无法触发IMessageFilter.RetryRejectedCall()。显然,Excel的Application.Wait()不会阻塞它的主线程,因为在发生这种情况时,我仍然可以调用属性和方法(但我会得到重复的IMessageFilter.MessagePending()通知)。

我的假设是,如果我完全阻止Excel的UI线程,那么我就可以让它拒绝来自我的应用程序的调用,并通过IMessageFilter.RetryRejectedCall()通知我,而不是骰子。我还试着用kernel32来休眠线程,但这也不起作用--我的应用程序只是做了一个阻塞等待,直到睡眠结束,Excel的主线程又启动了它的消息泵。

如何触发IMessageFilter.RetryRejectedCall(),即如何使Excel处于拒绝互操作调用的状态?我的目的是测试我的应用程序。我已经编写了模拟它的测试,但是很明显,我希望看到真正的实际情况。

相关员额:

如何让C#计时器在创建它的线程上执行?

C# Excel互操作--如何测试互操作对象是否仍在工作并执行任务?

EN

回答 1

Stack Overflow用户

发布于 2022-02-15 21:47:11

如何触发IMessageFilter.RetryRejectedCall(),即如何使Excel处于拒绝互操作调用的状态?

最简单的任务是使用VBA宏运行长期运行的任务。Excel将忙于运行VBA宏,并可能拒绝任何外部调用。

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

https://stackoverflow.com/questions/71132617

复制
相关文章

相似问题

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