首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程化,使用com+消息传递的SendMessage调用

线程化,使用com+消息传递的SendMessage调用
EN

Stack Overflow用户
提问于 2012-03-19 11:53:53
回答 1查看 1.5K关注 0票数 6

我有一个应用程序,它创建一个线程,通过窗口消息与主UI通信。它只需将消息发送到主应用程序线程并接收状态。

这样我就可以显示模态窗口并做其他事情。

问题是当我必须显示一个调用com+服务器的表单时。这样我就可以得到OLE错误8001010D:由于应用程序正在发送一个输入同步调用,所以不能进行传出调用。

我认为发生这种情况是因为主SendMessage正在使用,而com+调用需要windows消息传递来执行其任务。

无论如何,在delphi中,我不能从线程中显示表单,但是我如何解决这个问题……?

谢谢

编辑:

  1. MAIN(UI) 2.线程

线程(2)向主线程(1) B发送消息。主线程(1)接收消息,然后让它返回到一个线程,然后显示窗口。主线程中的模态窗口需要进行com+调用,出现上述错误。

  1. 模式窗口在哪个线程中? 2。COM调用是从哪个线程开始的? 3。在哪个线程中实例化了COM对象? 4。后台线程是否用STA初始化? 5。SendMessage处理程序是否显示模式形式?-罗曼R. 2分钟前

代码语言:javascript
复制
1. MAIN
2. MAIN
3. MAIN
4. CoInitializeEx(nil, COINIT\_MULTITHREADED);
5. yes.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-19 12:27:29

问题的原因是COM无法在处理SendMessage请求时封送传出的COM调用。出现的错误是RPC_E_CANTCALLOUT_ININPUTSYNCCALL (0x8001010D),您指的是这个错误。我的印象是,这只适用于作为传入线程间COM请求一部分的SendMessage调用,但是这可能是一个错误的假设。

典型的解决方法是将SendMessage替换为PostMessage,然后等待同步对象、事件或信号量。这样,调用方后台线程就不会保存消息来同步调用并自主地等待,在主线程上通过常规消息队列发送消息,并最终到达相同的处理程序。

作为奖励,您可以选择安全终止后台线程。如果当前它被等待模态对话框的SendMessage API锁定,建议的更改将允许您从主线程发出同步对象信号并让它继续运行,例如,如果您想安全地终止它。

另一种解决方案可能是调用InSendMessage函数,如果是的话-延迟模式UI,例如,再次向self发送消息,以便稍后在另一个消息处理程序中弹出表单。

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

https://stackoverflow.com/questions/9769673

复制
相关文章

相似问题

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