我有一个应用程序,它创建一个线程,通过窗口消息与主UI通信。它只需将消息发送到主应用程序线程并接收状态。
这样我就可以显示模态窗口并做其他事情。
问题是当我必须显示一个调用com+服务器的表单时。这样我就可以得到OLE错误8001010D:由于应用程序正在发送一个输入同步调用,所以不能进行传出调用。
我认为发生这种情况是因为主SendMessage正在使用,而com+调用需要windows消息传递来执行其任务。
无论如何,在delphi中,我不能从线程中显示表单,但是我如何解决这个问题……?
谢谢
编辑:
线程(2)向主线程(1) B发送消息。主线程(1)接收消息,然后让它返回到一个线程,然后显示窗口。主线程中的模态窗口需要进行com+调用,出现上述错误。
1. MAIN
2. MAIN
3. MAIN
4. CoInitializeEx(nil, COINIT\_MULTITHREADED);
5. yes.
发布于 2012-03-19 12:27:29
问题的原因是COM无法在处理SendMessage请求时封送传出的COM调用。出现的错误是RPC_E_CANTCALLOUT_ININPUTSYNCCALL (0x8001010D),您指的是这个错误。我的印象是,这只适用于作为传入线程间COM请求一部分的SendMessage调用,但是这可能是一个错误的假设。
典型的解决方法是将SendMessage替换为PostMessage,然后等待同步对象、事件或信号量。这样,调用方后台线程就不会保存消息来同步调用并自主地等待,在主线程上通过常规消息队列发送消息,并最终到达相同的处理程序。
作为奖励,您可以选择安全终止后台线程。如果当前它被等待模态对话框的SendMessage API锁定,建议的更改将允许您从主线程发出同步对象信号并让它继续运行,例如,如果您想安全地终止它。
另一种解决方案可能是调用InSendMessage函数,如果是的话-延迟模式UI,例如,再次向self发送消息,以便稍后在另一个消息处理程序中弹出表单。
https://stackoverflow.com/questions/9769673
复制相似问题